1. 3 + 5 = 8 を返す
  2. 0 + 0 = 0 を返す
  3. -1 + 1 = 0 を返す (符号違いの足し算)
  4. 大きめの数 100 + 250 = 350 を返す
  5. 両方マイナス -7 + -3 = -10 を返す
コース一覧
Java 中級:コレクション・Stream・例外処理
BiFunction と 2 引数の関数

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ5分

BiFunction と 2 引数の関数

引数が 2 つになったとたん、Function では受けられない

Function<T, R> の apply は引数を 1 つしか取りません。ところが実際に渡したい処理は、姓と名をつなぐ、単価と個数から金額を出す、といった 2 引数のものが山ほどあります。

Function<String, String> f = (last, first) -> last + first; と書いてもコンパイルは通りません。ラムダの引数の数が、インタフェースが決めている数と合わないからです。引数を 2 つ受け取りたいなら、最初から 2 つ受け取る型を選びます。それが java.util.function.BiFunction<T, U, R> です。

型は「入力 2 つ」と「出力 1 つ」で 3 つ書く

BiFunction<T, U, R> は「T と U を受け取って R を返す」という意味です。<> の中は入力が 2 つ並んで、最後が戻り値です。動かす命令は Function と同じ apply で、こちらは引数を 2 つ渡します。

Java

import java.util.function.BiFunction; public class Demo { public static void main(String[] args) { BiFunction<String, String, String> fullName = (last, first) -> last + " " + first; BiFunction<String, Integer, String> repeat = (text, times) -> text.repeat(times); System.out.println(fullName.apply("山田", "花子")); // 山田 花子 System.out.println(repeat.apply("ab", 3)); // ababab } }

fullName は 3 つとも String、repeat は入力の 2 つ目だけ Integer です。入力の型は揃っていなくて構いません。ここで型を 2 つしか書かず BiFunction<String, String> としてしまうと「型パラメータが足りない」というエラーになります。戻り値の分を数え忘れるのが定番のつまずきです。

なお、入力 2 つと出力がすべて同じ型になるときは、BinaryOperator<T> という短い別名も使えます。書き味は同じで、型を 1 つ書くだけで済みます。

引数が 2 つ以上のラムダは、かっこを省けない

引数が 1 つのラムダは s -> s.trim() のようにかっこを省略できますが、2 つ以上では省略できません。

Java

BiFunction<String, String, String> ng = last, first -> last + first; // 文法エラー BiFunction<String, String, String> ok = (last, first) -> last + first; // これが正しい

Java

BiFunction<String, String, Boolean> sameLength = (a, b) -> a.length() == b.length(); System.out.println(sameLength.apply("java", "html")); // true

incompatible types や Lambda expression not expected here というエラーが出たときは、たいていインタフェースが決めている引数の数と、ラムダに書いた引数の数がずれています。まず両方の数を数え直すのが早道です。

解説

標準ライブラリに用意されているのは 2 引数までです。TriFunction を import しようとしても見つかりません。3 つ以上になったら、引数をひとまとめにしたレコードを作って 1 引数に畳むのが実務では読みやすくなります。

課題では BiFunction の変数を作り、apply に 2 つの引数を渡した結果を返します。計算を直接 return しても数字は合いますが、apply を経由させることが今回の目的です。

要件

  1. ファイル先頭で import java.util.function.BiFunction; を書くこと
  2. メソッド本体で BiFunction<Integer, Integer, Integer> 型の変数を (x, y) -> x + y のラムダで初期化すること
  3. sum.apply(a, b) のように apply を呼び出した戻り値を return すること (直接 a + b を返さない)

入出力例

combine(3, 5) → 8 combine(0, 0) → 0 combine(-1, 1) → 0 combine(100, 250) → 350 combine(-7, -3) → -10

ヒント

`BiFunction` の型パラメータは `<引数1, 引数2, 戻り値>` の **3 個** です。`BiFunction<Integer, Integer>` のように 2 個にすると型エラーになります

2 引数のラムダは `(x, y) -> x + y` のようにかっこが必須です。`x, y -> x + y` と書くと文法エラーです

`apply` の戻り値は `Integer` ですが、`return` する変数の型が `int` なら **オートアンボクシング** で自動変換されるのでキャストは不要です

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 関数型インターフェース まとめクイズ

    関数型インターフェース (Lambda / メソッド参照 / Function / Predicate / Consumer / Supplier / BiFunction) の総まとめ。代表的な 7 つの関数型インターフェースの違いを 4 択クイズで確認する。

  • String.format で書式化

    `Java` の `String.format` で `%s` `%d` `%,d` `%.2f` などの書式指定子を使い、整形された文字列を組み立てる方法を学ぼう。

  • LocalDate で日付を扱う

    Java 8 で導入された java.time.LocalDate を使って、日付の生成・加減算・整形を学び、年月日から ISO 形式の文字列を返すコードを書いてみよう。

  • Files でファイルに書き込む

    Java の標準ライブラリ `java.nio.file.Files` を使って、ファイルへの書き込みと読み込みをわずか数行で実現する方法を学ぼう。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 引数位置引数=順番で渡す。
  • 処理計算や代入を表す長方形
  • コンパイルソースをバイトコードへ変換する処理
  • 戻り値呼び出し元への返答を表す点線矢印
  • 標準ライブラリPythonに同梱の公式モジュール群
  • レコードテーブル内の1件分のデータ(行)
  • 変数データに名前をつけて参照する仕組み
  • メソッドクラスに属する関数
main.java
学習モード
エディタを読み込んでいます

メモ

BiFunction と 2 引数の関数

⌘S で保存