【Java】ラムティー②


[クラスメンバーとローカル変数の使用]
ラムダ式の実行ブロックは、クラスのメンバー(フィールドおよびメソッド)およびローカル変数を使用することができる.
クラスのメンバーはコンストレイントされませんが、ローカル変数はコンストレイントされます.
1.クラスのメンバーの使用
ラムダ式実行ブロックは、クラスメンバーフィールドおよびメソッドに制限されない.ただしthisキーワードを使うときは注意が必要です.
  • 一般的に匿名対象内部にあるthis匿名対象の参照である
  • ラムダ式中this内部生成の匿名オブジェクトの参照ではなく、ラムダ式を実行するオブジェクトの参照.
  • ✔¥例
    次の例では、ram式から外部オブジェクトとネストされたオブジェクトの参照を取得し、フィールド値を出力する方法を示します.
    ネスト対象Innerでラムティーが実行されたためラムティー内部thisネスト対象Inner
  • MyFunctionalInterface(関数インタフェース)
  • @FunctionalInterface
    public interface MyFunctionalInterface {
        public void method();
    }
  • UsingThis.java(this使用)
  • public class UsingThis {
        public int outterField = 10;
    
        class Inner {
            int innerField = 20;
    
            void method() {
                //람다식
                MyFunctionalInterface fi = () -> {
                    System.out.println("outterField: " + outterField);
                    System.out.println("outterField: " + UsingThis.this.outterField + "\n");
    
                    System.out.println("innerField: " + innerField);
                    System.out.println("innerField: " + this.innerField + "\n");
                };
                fi.method();
            }
        }
    }
  • UsingThisExample(実行クラス)
  • public class UsingThisExample {
        public static void main(String[] args) {
            UsingThis usingThis = new UsingThis();
            UsingThis.Inner inner = usingThis.new Inner();
            inner.method();
        }
    }
  • 運転結果
  • outterField: 10
    outterField: 10
    
    innerField: 20
    innerField: 20
    2.ローカル変数の使用
    ラムダ式は主にメソッド内部で記述されるため,ローカル匿名実装オブジェクトを生成するものと考えられる.ラムダ式では、外部クラスのフィールドやメソッドは制限なく使用できるが、メソッドのパラメータやローカル変数を使用する場合、これら2つの変数はfinal特性を持たなければならない.したがって、ramda式からパラメータまたはローカル変数を読み込むことはできますが、ramda式の内部または外部で変更することはできません.
    ✔¥例
  • MyFunctionalInterface(関数インタフェース)
  • @FunctionalInterface
    public interface MyFunctionalInterface {
        public void method();
    }
  • UsingLocalVariable(Final特性を持つローカル変数)
  • public class UsingLocalVariable {
        void method(int arg) {    //arg는 final 특성을 가짐
            int localVar = 40;  //localVar는 final 특성을 가짐
            
            //arg = 31; //final 특성 때문에 수정 불가
            //localVar = 41;    //final 특성 때문에 수정 불가
            
            //람다식
            MyFunctionalInterface fi = () -> {
                //로컬 변수 읽기
                System.out.println("arg: " + arg);
                System.out.println("localVar: " + localVar + "\n");
            };
            fi.method();
        }
    }
  • UsingLocalVariableExample(実行クラス)
  • public class UsingLocalVariableExample {
        public static void main(String[] args) {
            UsingLocalVariable ulv = new UsingLocalVariable();
            ulv.method(20);
        }
    }
  • 運転結果
  • arg: 20
    localVar: 40
    [参考資料]
    これはジャワの本です.