Skip to content
閲覧中:
2. 2引数(Bi)シリーズ (21-40)

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 試験対策の「ひっかけ」チェック

  1. BinaryOperator の型引数: BinaryOperator<Integer, Integer> と書いてあったら間違いです。同じ型であることが前提なので、型引数は 1つ<Integer>)だけです。
  2. Map.merge の引数: 試験頻出の Map.merge(key, value, BiFunction) では、第3引数の BiFunction は「古い値」と「新しい値」を受け取ります。
  3. BiFunctioncompose**: 先述の通り、BiFunctioncompose メソッドは存在しません**(andThen のみ)。これは「関数の前に別の関数を差し込む際、差し込まれる側(Bi)の引数が2つだと、差し込む側(Function)の結果1つと数が合わない」ためです。

次は、名称がややこしくて差がつく 「3. プリミティブ特化型 (41-70)」 に進みますか? IntFunctionToIntFunction の違いなど、ここを乗り越えれば基礎は完璧です。