Study_The JAVA 8_3


Java基礎学習22.01.26(カウント)

ランダ式


Ramda式の設定


public class Foo {
	public static void main(String[] args) {
    		UnaryOperator<Integer> plus10 = (i) -> i + 10; // 인자(i) -> 바디(i+10)
            	System.out.println(plus10.apply(1));  // 11 출력
    	}
}	
  • (パラメータリスト)->本体からなる.
  • 本体は1行であり、上記1行を省略することができる.
    - 📖 パラメータ・リストのタイプ
    -パラメータがない場合:()->{body}//パラメータを受け入れないSupplier関数インタフェースが典型的な例です.
    -パラメータが1つしかない場合:(i)or i
    -パラメータが複数の場合:(i,j)
    −∧¥因子のタイプは、コンパイラによって推定されてもよいし、省略されてもよいので、選択によって明確または省略されてもよい.
  • 変数のスナップ


    ローカル変数の取得

    
    import java.util.function.*;
    
    public class Foo {
    	public static void main(String[] args) {
        		Foo foo = new Foo();
                	foo.run();
        	}
            
            private void run() {
            	int baseNumber = 10; // 사실상 Final인 변수(effective final)
                
                	IntConsumer printInt = (i) -> {
                     	System.out.println(i + baseNumber);
                   	};
                    
                    printInt.accept(10);
           	}
    }	
    
  • ランダボディでは、パラメータに加えて、ボディ以外の変数も参照できます.
    この挙動をLamdaキャプチャまたはローカル変数キャプチャと呼ぶ.
  • をキャプチャするために、上記の例のbaseNumberはFinalとして指定される.
    effect final(事実上不変、final特性を有する変数)の場合にのみ可能である.
  • Java 8までは常にfinalが必要です.有効finalは、匿名クラスインプリメンテーションまたはramdaにおいて参照可能な共通点を有する.
    匿名クラス実装体とは異なり、ランダには쉐도잉はない.

    の手入れを

  • 関数の外を指す関数が隠されています.
  • ローカルクラス、匿名クラス、RamdaクラスのScopeによって、Shadowingの範囲が異なります.
  • 
    import java.util.function.*;
    
    public class Foo {
    	public static void main(String[] args) {
        		Foo foo = new Foo();
                	foo.run();
        	}
            
            private void run() {
            	int baseNumber = 10; // 사실상 Final인 변수(effective final)
                
                //로컬 클래스
                Class LocalClass {
                	void printBaseNumber() {
                    	System.out.println(baseNumber);
                    }
                }
                                        
                //익명 클래스
                Consumer<Integer> integerConsumer = new Consumer() {
                	@Override
                    public void accpet(Integer integer) {
                    	System.out.println(baseNumber);
                    }
                };
                
                
                //람다
                IntConsumer printInt = (i) -> {
                   	System.out.println(i + baseNumber);
                };
                    
                printInt.accept(10);
           	}
    }	
    
  • の上の例により、図に示すように、各レベルのシャドウが図で表される.
  • ローカルクラス、匿名クラス

    
    import java.util.function.*;
    
    public class Foo {
    	public static void main(String[] args) {
        		Foo foo = new Foo();
                	foo.run();
        	}
            
            private void run() {
            	int baseNumber = 10; // 사실상 Final인 변수(effective final)
                
                //로컬클래스
                Class LocalClass { // 로컬클래스의 Scope 범위 시작
                	void printBaseNumber() {
                    	int baseNumber = 11; //참조하고있는 외부 변수와 동일한 변수명을 스코프 내에서 재정의
                    	System.out.println(baseNumber); // 10이 아닌 11이 출력된다.
                    }
                } // 로컬클래스의 Scope 범위 끝
                                        
                //익명클래스
                Consumer<Integer> integerConsumer = new Consumer() { // 익명클래스의 Scope 범위 시작
                	@Override
                    public void accpet(Integer baseNumber) { // 파라미터 이름을 참조하고 있는 외부 변수와 동일한 이름으로 변경
                    	System.out.println(baseNumber);
                    }
                }; // 익명클래스의 Scope 범위 끝
                
      	    printInt.accept(10);
           	}
    }	
    

  • 図に示すように、ローカルクラスと匿名クラスはそのスキャン範囲内にある.
    変数名と同じ変数名に再定義すると、
    変数は、外部参照の変数名を隠します.
  • ブルーダ

    
    import java.util.function.*;
    
    public class Foo {
    	public static void main(String[] args) {
        		Foo foo = new Foo();
                	foo.run();
        	}
            
            private void run() { // 람다의 Scope 범위 시작
                	int baseNumber = 10; // 사실상 Final인 변수(effective final)
                  
               	//람다
                	IntConsumer printInt = (baseNumber) -> { // 같은 변수명을 사용할 경우 컴파일 에러가 난다.
              	     	System.out.println(baseNumber);
              	};
                   
              	printInt.accept(10);
           	} // 람다의 Scope 범위 끝
    }	
    
  • 実際には、ラムダのスキャン範囲は外部方法の範囲と同じであるため、2つの同じ変数名を使用することはできない.
    どうしたんですか.違う
    匿名類は匿名の「対象」と見なすことができるが、これはラムダが対象ではないためだ.
    すなわち,匿名クラスでは自分を指し,ラムダでは自分を宣伝するクラスを指す.