ランダ式
Ramda式とは?
方法の表現.方法を簡単に表現した.匿名関数とも呼ばれます.
(파라미터) -> {메소드 구현}
() -> {메소드 구현}
(파라미터) -> 메소드 구현
(파라미터) -> {return 결과;}
一級オブジェクトのプロパティがあります.
ランダ式の使い方
クラス実装ではなく、内部実装の抽象的な方法を使用できます.
public interface MyFoo{
public int myFunction(int a, int b);
}
->
を使用して表現される.(파라미터)->{메소드 구현}
の形態で使用される.メソッド実装が1行減少した場合、ブロックを省略することができる.
public static void main() {
MyFoo mf1 = (a, b) -> {
System.out.println(a + "+" + b);
return a + b;
};
//블록 생략
MyFoo mf2 = (a, b) -> a + b;
}
関数インタフェース
内部に抽象的なメソッドが1つしかないインタフェースを関数型インタフェースと呼ぶ.
@FunctionalInterface
のプレゼンテーションを使用して、コンパイルフェーズで問題を特定できます.2つ以上の抽象メソッドが宣言されている場合、コンパイルエラーが発生します.
Variable Capture
変数を使用すると、ラムダは内部で値をコピーします.どうしてこのような方法を使うのですか.
まず,ランダを用いる方法は匿名実装オブジェクトを用いることと類似している.正確には,内部実装は異なるがhip領域に格納される.逆に、領域変数はスタック領域に格納されます.その後、メソッドの実行が完了すると、スタック領域から消えます.
hip領域のramdaが変数を使用しようとすると、スタック領域から変数が消えた場合、変数は無効になります.だからランダは価格をコピーして使っています.
しかしランダを使うと
final
変数しか使えません.これはなぜですか.別のスレッドで変数の値を変更すると、不正な結果が発生する可能性があります.したがって,同時性の問題のためには
final
変数のみが用いられる.ゾーン変数はfinalではないため、コンパイルエラーが発生し、インスタンス変数は無限に使用できます.
メソッド、作成者リファレンス
方法、作成者のコメントはランダをもっと簡単にすることができます.
1つのメソッドのみを呼び出す場合は、メソッドリファレンスを使用して表示を簡略化できます.
::
を使用します.@FunctionalInterface
public interface MyFoo {
public int myFunction(String s);
}
public static void main() {
MyFoo mf1 = (s) -> Integer.parseInt(s);
//메소드 레퍼런스 사용
MyFoo mf2 = Integer::parseInt;
}
ジェネレータリファレンスも同様に使用されます.public class MyInstance {
public String s;
public MyInstance(String s) {
this.s = s;
}
}
@FunctionalInterface
public interface MyFoo {
public MyInstance myFuntion(String a);
}
public static void main() {
MyFoo mf1 = (s) -> new MyInstance(s);
//생성자 레퍼런스 사용
MyFoo mf2 = MyInstance::new;
}
リファレンス
https://docs.oracle.com/javase/specs/jls/se10/html/jls-15.html#jls-15.27.2
Reference
この問題について(ランダ式), 我々は、より多くの情報をここで見つけました https://velog.io/@pond1029/lambdaテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol