Day16
ToDo
1.ランダ
JAvaはOOP言語ですが、jdk 1.8以降は関数型言語の機能が追加されています.
1.1ラムティー
1.2ラムティーの作り方
int max(int a, int b) {
return a > b ? a : b;
}
(a, b) -> a > b ? a : b
戻り値が(int a, int b) -> a > b ? a : b
=> (a, b) -> a > b ? a : b
作成時の注意事項
(a) -> a * a
=> a -> a * a
(int i) -> {
System.out.println(i);
}
=> (int i) -> System.out.println(i)
🖐 カッコ内の1行の文がreturn文の場合、カッコは省略できません⭕️
(int i, int b) -> {
return a + b;
}
❌
(int i, int b) -> return a + b
ただし、上記では戻り値があれば、戻り文を省略できます.つまり、returnを付ける場合は中かっこ、returnを省略する場合は中かっこを省略することもできます.では、上のコードでは、次の文をこのように書き換えることができます.(int i, int b) -> a + b //매개변수 타입도 생략가능
1.3ラムティーは匿名の対象
何でもラムダ式の方法なので、ラムダ式を呼び出すには参照変数が必要ですが、javaはこの参照変数のタイプを関数型インタフェースとして決定します.
1.4関数インタフェース
@FunctionalInterface
のキーワードを追加すると、コンパイラは関数インタフェースが正しく記述されているかどうかを確認します.//max라는 이름의 추상 메서드 하나만 선언되어있는 함수형 인터페이스
@FunctionalInterface
interface MyFunction {
public abstract int max(int a, int b);
}
//익명 클래스로 람다식을 구현했고, 참조변수의 타입은 MyFunction이라는 이름의 함수형 인터페이스 타입
MyFunction f = new MyFunction {
public int max(int a, int b) {
return a > b ? a : b;
}
}
int value = f.max(3,5); //5
1.4.1 java.util.関数パッケージ
このパッケージには、機能インタフェースが宣言されています.関数型インタフェースをパラメータとする方法を使用すると、Javaは、ユーザーが関数型インタフェースを定義するたびに、使用する必要がなく、一般的な機能を含む関数型インタフェースを入力するだけでパッケージを提供します.
ちなみに、パケット内のインタフェースを表示すると、抽象的なメソッドが宣言されていないと判断できます.本来はラーメンインタフェースで抽象メソッドを宣言するしかなかったが、java 1.8バージョンからインタフェースでエラーメソッドと静的メソッドを宣言できるようになった.
これらの方法により、2つ以上のラムティーを接続または実行するなど、複数のタスクを実行することができる.
1.4.2集合フレームワークと関数インタフェース
java.util.function
パッケージには、Predicatという関数インタフェースがあります.このインタフェースは、条件式をramda式として表すために使用されます.写真では、Predicatインタフェースはtestという抽象的なメソッドを宣言し、次のコードで使用できます.
Predicate<String> isEmptyStr = s -> s.length() == 0;
String s = "";
if (isEmptyStr.test(s)) {
System.out.println("빈 문자열입니다.");
}
以上のように、Predicate
は、boolean
の値を返すための条件付きフレームワークを提供する.ただし、集合フレームワークでは、これらの関数インタフェースも使用されます.例は次のとおりです.
写真は
Collection
レベルのremoveIf
メソッドコードを切り取ります.removeIf
方法は、パラメータによってPredicate
を実装するオブジェクトを受信することを見ることができる.我々が作成したラムダ式のPredicate
型匿名オブジェクトは,パラメータに移動し,条件式に従ってtrueをマッチングすると,要素のコードを削除する.このほか,Iterableインタフェースの
forEach(Consumer<T> action)
など多くの方法でram式をパラメータとして用いているため,使用中にコード内の方法がどのような関数型インタフェースタイプであるかを調べることができる.1.4.3方法の参考
import java.util.function.Function;
public class MethodReferenceEx {
public static void main(String[] args) {
// 3. 원래 람다식은 s -> new MyClass(s) 인데,
// Function<String, MyClass>를 통해 람다식의 매개변수의 타입과 리턴타입을 알 수 있으니 매개변수를 생략하고,
// '클래스명::메서드명' 으로 변경해줄 수 있다. 이게 메서드 참조를 사용하는 방식.
MyClass myClass = makeMyClass(MyClass::new); // = makeMyClass(s -> new MyClass(s));
System.out.println("name is: " + myClass.getName()); // name is: method reference
}
// 1. makeMyClass란 메서드에 매개변수로 Function인터페이스 타입의 람다식을 받겠다고 작성했다.
// 이 람다식은 String타입 매개변수를 받고, MyClass타입을 리턴한다.
private static MyClass makeMyClass(Function<String, MyClass> lambda) {
// 2. 람다식에 "method reference"이란 String 값을 인자로 전달한다.
String name = "method reference";
return lambda.apply(name);
}
}
public class MyClass {
String name;
public MyClass(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
リファレンス
Reference
この問題について(Day16), 我々は、より多くの情報をここで見つけました https://velog.io/@take/Day16テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol