1. 導入:なぜBiConsumerが必要なのか
Java 8で導入された関数型インターフェースの中でも、引数を2つ受け取り、戻り値を返さないBiConsumer
2. 基礎知識:BiConsumerとは?
BiConsumer
主なメソッドは以下の2つです。
・accept(T t, U u):受け取った2つの引数に対して処理を実行します。
・andThen(BiConsumer super T, ? super U> after):現在の処理の後に別の処理を連結させます。いわゆる「メソッドチェーン」を可能にする重要なメソッドです。
3. 実装/解決策:柔軟な処理の組み立て
BiConsumerを使用することで、ロジックを部品化できます。特にandThenを使用すれば、メインの処理を行った後に、共通のログ出力やバリデーション処理を繋げるといった「処理のパイプライン化」が容易になります。これにより、コードの再利用性が向上し、修正が必要な際も影響範囲を局所化できます。
4. サンプルプログラム
以下のコードは、Map内のユーザー情報に対して処理を行い、その後にログを出力する例です。
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class BiConsumerExample {
public static void main(String[] args) {
Map userScores = new HashMap<>();
userScores.put("田中", 85);
userScores.put("佐藤", 92);
// 1. 基本的なBiConsumerの定義(スコアを表示する)
BiConsumer printScore = (name, score) ->
System.out.println(name + "さんのスコアは " + score + " 点です。");
// 2. 処理を連結するBiConsumer(ログを出力する)
BiConsumer logger = (name, score) ->
System.out.println("[ログ] " + name + " の処理が完了しました。");
// 3. andThenで連結:表示してからログを出す
BiConsumer combinedProcess = printScore.andThen(logger);
// 4. MapのforEachに適用
userScores.forEach(combinedProcess);
}
}
5. 応用・注意点:現場で陥りやすい罠
現場での開発において注意すべき点は、andThenで連結した処理の「実行順序」です。連結された処理のいずれかで例外(RuntimeExceptionなど)が発生した場合、後続の処理は実行されません。
また、ラムダ式を多用しすぎると、スタックトレースが複雑になりデバッグが困難になることがあります。複雑すぎるロジックを1行のラムダ式に詰め込まず、必要に応じてメソッド参照(Method References)を活用して、可読性を維持するように心がけましょう。もし処理の内容が複雑になる場合は、無理に関数型インターフェースを使わず、通常のメソッドとして定義する勇気も必要です。

コメント