関数型インタフェースと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