java8 lambda 式とは

実装が必要なメソッドを1つだけ持つインターフェースに、
実現内容を簡単に書ける式。

例1:local classを利用した場合

    public static void main(String[] args) {

        // local class を利用した場合
        class LocalImp implements Runnable {
            public void run() {
                System.out.println("hello lambda!");
            }
        }

        Runnable runner = new LocalImp();
        runner.run(); // hello lambda!

    }

例2:無名classを利用した場合

    public static void main(String[] args) {

        // 無名class を利用した場合
        Runnable runner = new Runnable() {
            public void run() {
                System.out.println("hello lambda!");
            }
        };

        runner.run(); // hello lambda!

    }

例3:lambda式を利用した場合

    public static void main(String[] args) {

        // lambdaを利用した場合
        Runnable runner = () -> {System.out.println("hello lambda!");};

        runner.run(); // hello lambda!

    }

変数のスコープ

匿名クラスの使い方と同様、
外側で定義された変数を使用する場合、final もしくは実質的 final である必要がある。
(java8は、final定義が省略できるが、実質的finalが必要)

例1:final変数の参照

    public static void main(String[] args) {

        final int count = 1;

        Runnable runner = () -> {
            System.out.println("count is " + count);
        };

        runner.run(); // count is 1

例2:finalを省略する場合

    public static void main(String[] args) {

        int count = 1;

        Runnable runner = () -> {
            System.out.println("count is " + count);
        };

        runner.run(); // count is 1

    }

例3:実質finalではない場合、コンパイルエラー

    public static void main(String[] args) {

        int count = 1;
        count ++; //実質finalではない

        Runnable runner = () -> {
            System.out.println("count is " + count);
            // コンパイルエラー:Local variable count defined in an enclosing scope must be final or effectively final
        };

        runner.run();

    }

例4:外部参照を変更しよう場合、コンパイルエラー

    public static void main(String[] args) {

        int count = 1;

        Runnable runner = () -> {
            System.out.println("count is " + count);

            count ++;
            // コンパイルエラー:Local variable count defined in an enclosing scope must be final or effectively final
        };

        runner.run();

    }

stream APIとは

lambda式で、要素の集まりに対して様々な処理を行うAPI

処理の流れ

結果 = stream生成().中間操作A().中間操作A().中間操作A().終端操作();

・中間操作:
   戻り値がない、内容を編集するだけ。
・終端操作:
   戻り値があり。

よく使うものはこれを参照:
Java8 Streamざっくりまとめ

関数型インターフェイス

java se8で追加されたlambdaで使うパッケージ:
  公式:https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/package-summary.html

下記はよく使われる例;

・ Consumer<T>

T: 引数
interface: void accept(T)

Consumer<Goods> buyer = (goods) -> { System.out.println(goods.getName() + "を買いました。"); };

buyer.accept(new Goods("コーラ")); // コーラを買いました。

・ Function<T, R>

T: 引数
R: 戻り値
interface: R apply(T)

        Function<Integer, String> onePlus = (i) -> {
            return "結果は:" + (i + 1);
        };

        System.out.println(onePlus.apply(5)); // 結果は:6

・ Predicate<T>

T: 引数
interface: boolean test(T)
※テスト用かな。。。

        Predicate<String> isNull = (o) -> {
            return  null == o ;
        };

        boolean result = isNull.test("notNull");

        System.out.println(result); // false
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.