April Fools’ Day だから平凡な Java Puzzle をどうぞ

Java

Java8 がリリースされてから1年以上経過しているので Java プログラマの皆様はガシガシとその恩恵を受けた素晴らしいコードを書いていらっしゃるでしょう。

私は未熟者なのでボチボチとチマチマ楽しんでいます。(^_^;)

そこで問題です。

このプログラムを実行すると何が表示されますか?

1. Hello
    World!

2. World!
    Hello

3. コンパイルエラー

4.実行時エラー

すいません。

簡単すぎますね。

答えは 3番のコンパイルエラーです。

ラムダ式の中から外部の変数を参照する場合、その変数はfinalもしくは実質的finalでなければならない。

このルールに違反しているからです。

どうすればこのプログラムを正しく動かせるでしょうか?

それも簡単なので答えを載せておきますね!

このプログラムは for ループ文を使っているのでまずは、拡張 for ループ文で修正してみましょう。

拡張 for ループ文は少しばかりの制約はあるけど要素を先頭から順に取得するような処理には便利に使えます。

for ループ文ではインデックス取得の為に実質的ファイナルでない変数にアクセスしてコンパイルエラーになりましたが拡張 for ループ文だとそのような心配はありません。

あっけなく、簡単に修正できました。それでは、default void forEach(Consumer<? super T> action) を使って修正してみます。

こちらの方法が Java8 っぽいので個人的には好きです。

でも内部的には、デフォルト実装の動作は次のようになっているそうです。

for (T t : this)
    action.accept(t);

つまり、こういうことなのかな?

以上のことを考慮してラムダ式使う場合は、forEach(Consumer<? super T> action) を使うのが良さそうですね。

これで平凡なパズルはお終いです。

Hatena タグ:

« »

Leave a Reply

* が付いている項目は、必須項目です!

次の HTML タグと属性を利用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

*

Trackback URL