Java8ラムダ式の問題点

Java8のラムダ式の実装には大きな問題があると思う。

まだ、正式に提供されているわけではないので、まだ分らないが正式提供版では是非とも直してもらいたい点が1つ。

それは、ラムダ式の中でラムダ式外の変数をキャプチャできないこと。キャプチャだけならともかく、参照すらNG(finalまたはそれに準ずるもの以外)。

これは、ループ内の変数等をラムダ式で扱えないことを意味する。例えば、以下のようなものはコンパイルエラーとなってしまうのである。

for (int i=1; i <= 12; i++) {
persons.stream()
.filter(p->p.getBirthMonth() == i) // ここでiがfinalじゃないって怒られる
.forEach(p->{System.out.println(p);});
}

これって、超使えないと思わない?

たけぞう

たけぞう について

某ソフトウェア開発会社勤務。 開発の仕事は卒業しますた。 ・・・と思ったら、また開発に逆戻り(^^; ・・・と思ったら、また卒業らしい・・・
カテゴリー: Java, 技術情報 パーマリンク

Java8ラムダ式の問題点 への2件のフィードバック

  1. きしだ のコメント:

    まあ、実際には匿名クラスを使った実装になっているので仕方ないんじゃないでしょうか。

    再代入可能な変数というのを使う機会もそれほど多いわけじゃないですし、文中の例であれば一旦別の変数を経由して
    for (int i=1; i p.getBirthMonth() == ii)
    .forEach(p->{System.out.println(p);});
    }
    のようにすれば問題ないので、実際に必要になる頻度の低さと解決方法の簡単さから、「超使えない」とは思えません。

    あと、Streamを使うなら
    Streams.intRange(1, 13).forEach(i -> {
    persons.stream()
    .filter(p->p.getBirthMonth() == i)
    .forEach(p->{System.out.println(p);});
    });
    でもいいですね。

  2. たけぞう たけぞう のコメント:

    for文の中で、新たにfinal変数を宣言して、初期値をiとしたらコンパイルエラーも出ないし、きちんと動作した。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です