Lambda式

5941 ワード

きほんけいじょう
(パラメータリスト)->本体
パラメータリスト
パラメータ
  • がない場合:()
  • パラメータが
  • の場合:i or(i)
  • 複数のパラメータが
  • の場合:(i,j)
  • パラメータタイプは省略可能であり、コンパイラによって推論/宣言される
  • 本体
  • 矢印の右側に関数本文
  • を定義する
  • 多列使用{}バンドル
  • ,{}を減らすと、
  • を省略できます.
    変数取得可変取得
  • ローカル変数の取得
  • finalまたは有効finalの場合のみ、
  • を参照してください.
  • そうでないと、同時性の問題が発生する可能性があります.
  • effective final
  • は実際にfinal変数
  • に相当する.
  • finalキーワードを使用しない有効なfinal変数は、匿名クラスインプリメンテーションまたはramdaで参照できます.
  • ビュー(範囲コンセプト)
  • 匿名クラスには新しいscopeがありますが、ランダをめぐるscopeを共有しています.
  • コード#コード#
    	private static void run() {
            // 사실상 finald인 더이상 변경되지 않는 변수
            // effective final 일 경우에만 람다, 로컬클래스, 익명 내부 클래스에서 참조가 가능하다
    
            int basenumber = 10; // 변수
    
            // 로컬 클래스 : 쉐도잉 가능
            // 개별 scope를 갖는다
            class localClass {
                void printBaseNumber() {
                    int basenumber = 11;
                    System.out.println(basenumber);
                }
            }
            localClass local = new localClass();
            local.printBaseNumber();
    
            // 익명 내부 클래스 : 쉐도잉 가능 (외부 변수를 현재 스코프 내 변수가 덮는다)
            // 개별 scope를 갖는다
            Consumer<Integer> integerConsumer = new Consumer<Integer>() {
                @Override
                public void accept(Integer basenumber) {
                    System.out.println(basenumber);
                }
            };
            integerConsumer.accept(10);
    
            // 람다 : 쉐도잉 불가능 (동일 변수 선언 불가능)
            // 현재 람다식이 존재하는 메서드와 scope가 동일하다
            IntConsumer printInt = (i) -> {
                //int basenumber;
                System.out.println(i + basenumber);
            };
    
            printInt.accept(10);
        }