🐑

今までのラムダ式、これからのラムダ式(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() に集約することで思考を止めない

  • runcall を分けない
  • 即時実行保持実行.of().da() で切り替え

throws E による型推論

  • IOException | SQLExceptionE extends Throwable で対応
  • ラムダ式から「実行されうる例外型」を自動で推論

✅ 最大20引数まで対応済み

  • ThrowableFunctionN / ThrowableConsumerN をすでに内包
  • 拡張性も問題なし

今までのラムダ vs これからのラムダ

特性 今までのラムダ Lambによるラムダ
例外処理 try-catch 必須 throws 対応で外に出せる
型推論 弱い(final var ✕) 強い(final var ○)
保持と実行 区別されて煩雑 of().da() で明快に切替
可読性 インターフェース名が冗長 書きたい処理だけに集中できる

従来のラムダ式は "使いづらく不完全" だった。
しかし Lamb によって、「例外を含めた業務ロジック」をラムダに自然に書ける未来が開けた。

今までのラムダ式:使いづらいから妥協するもの
これからのラムダ式:構造的に書けるから頼れるもの

Lamb は、Javaのラムダ式に“完成”をもたらす技術だ。


リンク

Discussion