5️⃣
関数型インターフェースとラムダ式
概要
「Java SE 11 Programmer II (1Z0-816-JPN) 試験」の出題範囲「関数型インターフェースとラムダ式」の自己学習メモになります
関数型インターフェース
独自の関数型インターフェースの定義
- 単一の抽象メソッドをもつインターフェース
- staticメソッドとdefaultメソッドは定義可能
- java.lang.Objectクラスのpublicメソッドは抽象メソッドとしての宣言は可能
- 関数型インターフェースとして明示的する場合は、@Functionllnterfaceを付与する
ローカル変数の型推論
varが利用できる箇所一覧
- ローカル変数の初期化
- 通常for文内のインデックス
- 拡張for文内で宣言されたローカル変数
- try-with-resource文内のローカル変数
ラムダ式
構文
( 実装するメソッドの引数 ) → { 処理 };
- 引数が1つの場合、データ型や()省略可能
- 引数がない場合と、引数が複数ある場合は、()の省略はできない
- データ型を明示している場合も、()の省略はできない
- 処理が1文の場合は{}の省略が可能
- {}の省略している場合、更にreturnの省略が可能
- returnを省略した場合、最後の文で終わるように;が必須
主な関数型インターフェース
インターフェース名 | 抽象メソッド | 説明 |
---|---|---|
Function<T,R> | R apply(T t) | 実装するメソッドは、引数としてTを受け取り、結果としてRを返す |
BiFunction<T,U,R> | R apply(T t,U u) | 実装するメソッドは、引数としてTとUを受取、結果としてRを返す |
Consumer<T> | void accept(T t) | 実装するメソッドは、引数としてTを受け取り、結果を返さない |
BiConsumer<T,U> | void accept(T t,U u) | 実装するメソッドは、引数としてTとUを受取、結果を返さない |
Predicate<T> | boolean test(T t) | 実装するメソッドは、引数としてTを受け取り、結果としてboolean値を返す |
BiPredicate<T,U> | boolean test(T t,U u) | 実装するメソッドは、引数としてTとUを受け取り、結果としてboolean値を返す |
Suppller<T> | T get() | 実装するメソッドは、何も引数として受け取らず、結果としてTを返す |
UnaryOperator<T> | T apply(T t) | 実装するメソッドは、引数としてTを受け取り、結果としてTを返すものになる |
BinaryOperator<T> | T apply(T t1, T t2) | 実装するメソッドは、引数としてTを受け取り、結果としてTを返すものになる |
実質的final
メソッド参照
構文
クラス名 / インスタンス変数名 :: メソッド名
サンプルコード
Function<String,Integer> f1 = str -> Integer.parseInt(str);
staticメソッド参照
サンプルコード
Comparator<Integer> comp = Integer::compare;
System.out.println(comp.compare(1,2));
System.out.println(comp.compare(2,1));
インスタンス参照
サンプルコード
List<Integer> list = list.of(3,1,2);
list.forEach( a -> System.out.println(a + " ")); // OK
list.forEach( System.out::println + " " ); // NG
コンストラクタ参照
構文
クラス名 :: new
サンプルコード
Function<Integer,String[]> obj = String[]::new;
基本データ型を扱う関数型インターフェース
引数や戻り値の型に使用する関数型インターフェース
iインターフェース名 | 抽象メソッド |
---|---|
IntFunciton<R> | R apply(int value) |
IntConsumer | void accept(int value) |
IntPredicate | boolean test(int value) |
IntSupplier | int getAsInt() |
IntUnaryOperator | int applyAsInt(int operand) |
IntBinaryOperator | int applyAsInt(int left, int right) |
int、double、long固有の関数型インターフェース
インターフェース名 | 抽象メソッド |
---|---|
ToIntFunction<T> | int applyAsInt(T value) |
ToIntBiFunction<T,U> | int applyAsInt(T t, U u) |
IntToDoubleFunction | double applyAsDouble(int value) |
IntToLongFunction | long applyAsLong(int value) |
ObjIntComsumer<T> | void accept(T t, int value) |
関数型インターフェースの命名パターン
- 引数を2つもつ場合、クラスの接頭辞は「Bi」
- 引数の型が決まっている場合、クラス名の接頭辞が「引数の型名」
- 戻り値の型が決まっている場合は、クラス名の接頭辞が「To 戻り値の型名」
- 引数と戻り値の型が決まっている場合は、クラス名の接頭辞が「引数の型名 To 戻り値の型名」
関数型インターフェースの合成
合成を提供する主なメソッド
メソッド名 | 説明 |
---|---|
andThen | 例 Consumer andThen (Consumer after) 自身を実行した後、afterを実行した結果を返す |
compose | 例 Function compose (Function before) beforeを実施した後、自身を実行した結果を返す |
and | 例 Predicate and (Predicate other) 自身およびotherの条件を満たしたときのみtrueを返す |
or | 例 Predicate or (Predicate other) 自身およびotherのどちらかが条件を満たしたときtrueを返す |
negate | 例 Predicate negate() 自身の条件結果を反転した結果を返す |
Discussion