2. 2引数(Bi)シリーズ (21-40)
2引数シリーズ(Biシリーズ)は、その名の通り**引数を2つ取る**インターフェース群です。Mapの操作や、2つの値を比較・結合する処理で頻出します。
21番から40番までの項目を、サンプルコードと共に詳しく解説します。
21-23. 基本のBiシリーズ¶
引数が2つ(TとU)に増えますが、戻り値の考え方は4大インターフェースと同じです。
| 項目 | インターフェース | 抽象メソッド | 引数 | 戻り値 |
|---|---|---|---|---|
| 21 | BiPredicate<T, U> |
test(T t, U u) |
2 | boolean |
| 22 | BiConsumer<T, U> |
accept(T t, U u) |
2 | void |
| 23 | BiFunction<T, U, R> |
apply(T t, U u) |
2 | R |
Java
// 21. BiPredicate: 2つの引数を判定
BiPredicate<String, Integer> checkLength = (s, i) -> s.length() == i;
System.out.println(checkLength.test("Java", 4)); // true
// 22. BiConsumer: 2つの引数を消費(MapのforEachで多用)
Map<Integer, String> map = Map.of(1, "Apple", 2, "Banana");
map.forEach((k, v) -> System.out.println(k + ":" + v)); // 22, 26番の内容
// 23. BiFunction: 2つの引数を取って別の型を返す
BiFunction<String, String, Integer> totalLength = (s1, s2) -> s1.length() + s2.length();
24-25. BinaryOperator(同型2引数)¶
BinaryOperator<T> は BiFunction<T, T, T> の省略形です。「2つの同じ型の値を受け取り、同じ型で返す」計算(足し算や最大値など)に使われます。
Java
// 24. BinaryOperator: 引数2つ(T, T) -> 戻り値 T
BinaryOperator<Integer> sum = (a, b) -> a + b;
// 25. 継承関係の確認
// BinaryOperator<T> extends BiFunction<T, T, T> です。
26-27. Map操作での実例¶
試験では、インターフェース単体よりも Map のメソッドと組み合わせて出題されます。
Java
Map<String, Integer> prices = new HashMap<>();
prices.put("Apple", 100);
// 27. replaceAll: すべての値を計算して置き換える (BiFunctionを使用)
prices.replaceAll((name, price) -> price + 10); // 全品10円値上げ
28-30. Biシリーズの制約と拡張¶
- 28. SupplierにBiはない:
Supplierは「引数なし」が定義なので、2つ引数を取るBiSupplierというものは存在しません。 - 29. 3引数以上: 標準ライブラリには
TriFunctionなどはありません。必要なら(a, b, c) -> ...のような独自のインターフェースを定義します。
31-40. メソッド参照とデフォルトメソッド¶
Biシリーズでも、メソッド参照や条件の結合が可能です。
Java
// 31. メソッド参照 (特定の型の任意オブジェクトのインスタンスメソッド)
// (s1, s2) -> s1.compareTo(s2) と同じ
BiFunction<String, String, Integer> comp = String::compareTo;
// 32. BiPredicateの結合 (and, or, negate)
BiPredicate<String, Integer> p1 = (s, i) -> s.length() > i;
BiPredicate<String, Integer> p2 = (s, i) -> s.startsWith("J");
BiPredicate<String, Integer> combined = p1.and(p2);
// 33. BiFunctionの連鎖 (andThenのみ)
// composeは「引数が1つ」であることを前提とするため、BiFunctionには存在しません
BiFunction<Integer, Integer, Integer> multiply = (a, b) -> a * b;
Function<Integer, String> toString = String::valueOf;
BiFunction<Integer, Integer, String> combinedFunc = multiply.andThen(toString);
💡 Java Gold 試験対策の「ひっかけ」チェック¶
BinaryOperatorの型引数:BinaryOperator<Integer, Integer>と書いてあったら間違いです。同じ型であることが前提なので、型引数は 1つ(<Integer>)だけです。Map.mergeの引数: 試験頻出のMap.merge(key, value, BiFunction)では、第3引数のBiFunctionは「古い値」と「新しい値」を受け取ります。BiFunctionのcompose**: 先述の通り、BiFunctionにcomposeメソッドは存在しません**(andThenのみ)。これは「関数の前に別の関数を差し込む際、差し込まれる側(Bi)の引数が2つだと、差し込む側(Function)の結果1つと数が合わない」ためです。
次は、名称がややこしくて差がつく 「3. プリミティブ特化型 (41-70)」 に進みますか? IntFunction と ToIntFunction の違いなど、ここを乗り越えれば基礎は完璧です。