ソフトウェアエンジニアの日常の雑記

日々思ったことをまとめます

Javaの関数インターフェース再入門

本家はこちら

Javaのよく使ってる関数インターフェース群をまとめようかとおもう。 現場ごとに説明のためのドキュメントを書くのがしんどくなってきたからというのが本音かも。

predicate

断言するって意味。戻り値はBoolean。 引数1つとって

Predicate<String> matchA = s -> s.matches(".*a.*");  // 'a'があればtrue
Predicate<String> matchB = s -> s.matches(".*b.*"); // 'b'があればtrue
Predicate<String> noA = matchA.negate(); // 'a'があったらfalse

// 合成
Predicate<String> ab = matchA.and(matchB); // 'a'と'b'があったらtrue
Predicate<String> ab = matchA.or(matchB); // 'a'または'b'があったらtrue

実行はtest(T)でできる。カンタン。streamのfilterとかで使える。テストもカンタン。

matchA.test("a");

これで実行できる。

ちなみに2つ引数とることもできる

BiPredicate<String,String> matchAB = (s,t) -> s.matches(".*a.*") && t.matches(".*a.*");

suppplier

供給するって意味

引数なし、戻り値あり。引数ないけど、それ単体で何かが発生する。 なにかと組み合わせてデータ流す感じかな

Supplier<String> supplier = () -> {
     SecureRandom random = new SecureRandom();
     return String.valueOf(random.nextInt());
};

ランダムintを返却する

supplier.get()

consumer

消費するって意味。 実際に引数とって、そのあと処理する。戻り値なし。

下記のような感じ

Consumer<String> show = s -> System.out.println(s);

下記のように使う

s.accept("s");

2つ引数とることも可能

BiConsumer<String,Integer> biShow = (s,i) -> {
    System.out.println(s);
    System.out.println(i);
};

Function

機能として使える関数インターフェース

引数と戻り値を持てる。 引数2つまで持てるものもある。(BiFunction)

下記のように定義できる

Function<Integer,String> exchangeString = t -> String.valueOf(t);
BiFunction<Integer,Integer,String> biExchange = (t,u) -> String.valueOf(t + u);

下記のように使える

exchangeString.apply(1);
biExchange.apply(1,2);