🐑
今までのラムダ式、これからのラムダ式(Java)
今までのラムダ式、これからのラムダ式(Java)
はじめに
Javaでラムダ式が導入されて以来、私たちは簡潔に処理を書けるようになった。しかし、try-catch や チェック例外 の存在が、ラムダ式の「軽さ」を奪ってきたのも事実だ。
この記事では、従来のラムダ式の限界を整理し、そこから一歩踏み込んで構造的に解決したユーティリティ Lamb を紹介する。これは単なるツールではなく、「ラムダ式のこれからの書き方」を再定義する設計思想でもある。
今までのラムダ式
❌ final var での宣言ができない
final var fn = (String str) -> str; // ❌ 型が推論できずコンパイルエラーになる
- 関数型インターフェースを明示しない限り、
final varにラムダを代入できない - ラムダ式の“軽さ”と
varの“軽量さ”が共存できない
❌ Javaはラムダ式を“書ける”が“美しくない”
Function<String, String> fn = (str) -> str;
-
Function<T, R>を明示しないと代入できず、型推論が弱い -
final varにしたくてもコンパイルエラー - Javaの文法上、「軽く書く」ことと「安全に書く」ことの両立が難しい
❌ 例外に弱いのは“標準インターフェースに依存しているから”
Function<String, String> fn = str -> {
if (str.isEmpty()) throw new IOException("empty"); // ❌ コンパイルエラー
return str;
};
-
Function<T, R>などの標準関数型インターフェースはthrowsを許容しない -
そのため、例外を投げたい場面でもラムダで自然に書けない
-
結果としてラムダ式内で
try-catchを強いられ、軽さや汎用性が失われる
これからのラムダ式 - Lamb で実現する世界
✅ より自然な宣言と保持も可能に
// Lambあり
final var fn = Lamb.of((String str) -> str); // ✅ 型推論が効く
final String result = fn.da("hello"); // => "hello"
-
final varによる推論とLamb.of()の組み合わせで宣言が軽量に - ラムダの保持と実行が統一された構文で可能
- 引数の数、戻り値の有無でオーバーロードするため、型推論が効く
✅ 基本構文
final String result = Lamb.da(() -> "Hello, Lamb");
✅ 例外も通せる
final String result = Lamb.da(() -> {
if (somethingWrong()) throw new IOException();
return "OK";
});
✅ 戻り値なしでも自然
Lamb.da(() -> {
doSomething();
});
✅ 引数ありも自然
final int len = Lamb.da(s -> s.length(), "hello");
✅ 複数の例外も型安全に処理
try {
Lamb.da(() -> {
if (cond1) throw new IOException();
if (cond2) throw new SQLException();
return "done";
});
} catch (IOException | SQLException e) {
handle(e);
} catch (Exception e) {
throw new RuntimeException(e);
}
設計の要点
✅ da() に集約することで思考を止めない
-
runとcallを分けない -
即時実行と保持実行は.of().da()で切り替え
✅ throws E による型推論
-
IOException | SQLExceptionもE extends Throwableで対応 - ラムダ式から「実行されうる例外型」を自動で推論
✅ 最大20引数まで対応済み
-
ThrowableFunctionN/ThrowableConsumerNをすでに内包 - 拡張性も問題なし
今までのラムダ vs これからのラムダ
| 特性 | 今までのラムダ | Lambによるラムダ |
|---|---|---|
| 例外処理 | try-catch 必須 | throws 対応で外に出せる |
| 型推論 | 弱い(final var ✕) | 強い(final var ○) |
| 保持と実行 | 区別されて煩雑 | of().da() で明快に切替 |
| 可読性 | インターフェース名が冗長 | 書きたい処理だけに集中できる |
従来のラムダ式は "使いづらく不完全" だった。
しかし Lamb によって、「例外を含めた業務ロジック」をラムダに自然に書ける未来が開けた。
✅ 今までのラムダ式:使いづらいから妥協するもの
✅ これからのラムダ式:構造的に書けるから頼れるもの
Lamb は、Javaのラムダ式に“完成”をもたらす技術だ。
Discussion