NetBeans 8 Dev を使って Lambda で遊ぶ その5

今日も Java 8 に備えて良く解らないけど未来のコードと戯れたいと思います。

今回は、Functional Interface と Virtual Extension Methods を試してみたいと思います。

ただ、@FunctionalInterface の使い方がこれであっているのか?解りません(>_<。)

@FunctionalInterface を消しても同じようにコンパイル、実行できてしまうんですよね~

@Override なんかと同じでただの注釈なのかなぁ・・・

メリットが良く解らんぜよw

Virtual Extension Methods は以前にも試したんだけど default キーワードのつく位置が変わったの(決められた)のかな。

さて、それでは試してみます。

jp\yucchi\myfunctionalinterface\MyFunctionalInterface.java
package jp.yucchi.myfunctionalinterface;

public class MyFunctionalInterface {

    @FunctionalInterface
    private interface FuncInterface {

        public void hoge(); // 対象メソッド

        @Override
        public String toString(); // あっても関係ないね

        @Override
        public boolean equals(Object o); // あっても関係ないね
    }

    @FunctionalInterface
    private interface CompFuncInterface extends FuncInterface {

        // Virtual Extension Methods
        default public void foo() {
            System.out.println("foo");
        }

        // Virtual Extension Methods
        default public void bar() {
            System.out.println("bar");
        }
    }

    public static void main(String[] args) {
        chome(() -> {
            System.out.println("hoge");
        });
    }

    private static void chome(CompFuncInterface cfi) {
        cfi.hoge();
        cfi.foo(); // Virtual Extension Methods
        cfi.bar(); // Virtual Extension Methods
    }
}

実行結果は次のとおりです。

run:
hoge
foo
bar
BUILD SUCCESSFUL (total time: 0 seconds)

実行結果からみて Functional Interface の動作は定義されているとおりに問題なく動いているようです。

Functional Interface の定義については長くなりますのでググってみてください。

日本語で詳しく説明されているサイトが見つかるはずです。

今回のプログラムでは

@Override
public String toString(); // あっても関係ないね

@Override
public boolean equals(Object o); // あっても関係ないね

Object クラスのこの二つのメソッドがあっても問題ないこと、

// Virtual Extension Methods
default public void foo() { 
    System.out.println("foo");
}

// Virtual Extension Methods
default public void bar() { 
    System.out.println("bar");
}

この Virtual Extension Methods の default 実装があっても Functional Interface の機能を問題なく実行できることを証明しました。

ちゃんとラムダ式で動いてます。(^_^)

    chome(() -> {
        System.out.println("hoge");
    });
}

実行結果からちゃんと二つの Virtual Extension Methods も動いているのが解ります。

Java 8 の正式リリースが楽しみですね(*^▽^*)

Hatena タグ: ,

Java 8 Date and Time API の素敵なコード

Java 8 で採用される Lambda よりもひょっとしたら素敵な Date and Time API の素晴らしい使い方をネットで見つけました。

NetBeans 8 Dev を使って Lambda で遊ぶ その2 で Date and Time API を使って年齢を取得しました。

今日、ネットサーフィン(死語)で素晴らしいコードを見つけたのでそれを使ってみました。

変更前のコード

public int getAge() {
    LocalDate today = LocalDate.now();
    int age = today.getYear() - birthday.getYear();
    if (birthday.getMonthValue() > today.getMonthValue()
            || birthday.getMonthValue() == today.getMonthValue()
            && birthday.getDayOfMonth()
            > today.getDayOfMonth()) {
        age--;
    }
    return age;
}

変更後のコード

public int getAge() {
    LocalDate today = LocalDate.now();        
    return Period.between(birthday, today).getYears();
}

とてもすっきりしてますね(^_^)

この情報は日本語でこちらのサイトの記事を参考にさせていただきました。

年齢を計算する、java.util.Calendarとjava.time.LocalDateとで

詳しく丁寧に解説されていますので興味のある方は参考に!

ちなみに、私は年齢の繰り上がる日時を今の今まで思い違いをしてました( ̄。 ̄;)

Hatena タグ: