関数型インタフェースとStream API
関数型インタフェースとStream APIの復習をしたのでメモ
関数型インタフェース
インタフェース | メソッド | 説明 |
---|---|---|
Function<T, R> | R apply(T t) | T型の引数を受け取ってR型の結果を戻す |
Consumer< T > | void accept(T t) | T型の引数を受け取って処理する(戻り値なし) |
Supplier | T get() | 引数に受け取らずに結果を戻す |
Predicate< T > | boolean test(T t) | 受け取った引数を評価/判定する |
// Function Function<Integer, Integer> func1 = (Integer i) -> i * 10; System.out.println(func1.apply(10)); Function<Integer, String> func2 = (Integer i) -> String.valueOf(i); System.out.println(func2.apply(10)); // Consumer Consumer<String> consumer1 = (String str) -> System.out.println(str); consumer1.accept("hello"); // Supplier Supplier<Date> supplier1 = () -> new Date(); System.out.println(supplier1.get()); // Predicate Predicate<Integer> predicate1 = (Integer i) -> i % 2 == 0; System.out.println(predicate1.test(2));
StreamAPI
コレクションに対する処理をラムダ式でかっちょよく操作するためのAPI。 上記の関数型インターフェースを引数にとる便利なメソッドが用意されている。
- Stream filter(Predicate
) - Stream map(Function<T, R>)
- Stream sorted(Comparator
) - void forEach(Consumer
)
List.of(3, 8, 7, 10, 5, 1, 9, 2, 4, 6) .stream() .filter((i) -> i % 2 != 0) .sorted((i, j) -> i - j) .map(i -> "<" + i + ">") .forEach(System.out::println); // <1><3><5><7><9> が出力
メソッド参照
上記のようにメソッドの引数でメソッドを参照させるための仕組み
呼び出したいメソッド名の直前に「::」を指定し、さらにその前にはクラス名を記述する。
メソッドの引数部分の「()」は省略する。
構文 | ラムダ式例 | 例 |
---|---|---|
クラスメソッド | クラス名::メソッド名 | String::valueOf |
インスタンスメソッド | オブジェクト名::メソッド名 | System.out::println |
コンストラクタ | クラス名::new | ArrayList::new |