5️⃣

関数型インターフェースとラムダ式

2024/05/31に公開

概要

「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