アカウント名:
パスワード:
java.lang.iterableなiに対して,val ls = i.iterator.toList.map(hoge)を実行しておかしな結果が.
正しくはval ls = i.iterator.map(hoge).toListじゃないとダメだった.これが原因だとわかるのに3時間かかって涙目でした.
元のiterableコンテナの中身に対して, それぞれhogeを適用して結果をリストにしたいのに,中身が実は同一要素の参照で,hogeするたびにフレッシュな値が返ってくる仕様.
もうJavaでLambdaが実装されましたっけ?と思ったのですがもしかしてJavaではなくScalaでしょうか。iterator.map(hoge)がつかるようになるとJavaも気持ちよくかけそうなんですけどね。
#2299417 [srad.jp] は Scala のコードみたいですね。 Java で Lambda が実装されるのは次のバージョン (Java 8) です。匿名クラスのインスタンスを作るのと似たような感じで使えるものになる予定 [hatena.ne.jp]です。
iterator.map(hoge)がつかるようになるとJavaも気持ちよくかけそうなんですけどね。
一応今でも、 Google Guava ライブラリの Iterators#transform [googlecode.com] を使えば可能です。こんな感じで (コンパイルも通してませんが) 。
Iterator<Integer> numsx10 = Iterators.transform(nums, new Function<Integer, Integer>() { @Override public Integer apply(Integer num) { return num * 10; }});
これが、 Java 8 の Lambda を使うとこんな感じになるはず。
Iterator<Integer> numsx10 = Iterators.transform(nums, (num) -> num * 10);
コメントありがとうございます。
一応今でも、 Google Guava ライブラリの Iterators#transform [googlecode.com] を使えば可能です。こんな感じで (コンパイルも通してませんが) 。 Iterator numsx10 = Iterators.transform(nums, new Function() { @Override public Integer apply(Integer num) { return num * 10; } });これが、 Java 8 の Lambda を使うとこんな感じになるはず。 Iterator numsx10 = Iterators.transform(nums, (num) -> num * 10);
Iterator numsx10 = Iterators.transform(nums, new Function() { @Override public Integer apply(Integer num) { return num * 10; } });
Iterator numsx10 = Iterators.transform(nums, (num) -> num * 10);
うーん、どちらもScalaやC♯とかをみてしまうと微妙ですね。JVM系言語であれば、既存のJavaのライブラリを使用しつつ素直にScalaやGroovy(もしくはClojure)を使うのがよいのかもしれませんね。
ということで、今年こそScalaの勉強をしないと…。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常
初ハマり (スコア:2)
java.lang.iterableなiに対して,
val ls = i.iterator.toList.map(hoge)を実行しておかしな結果が.
正しくは
val ls = i.iterator.map(hoge).toList
じゃないとダメだった.
これが原因だとわかるのに3時間かかって涙目でした.
元のiterableコンテナの中身に対して, それぞれhogeを適用して結果をリストにしたいのに,
中身が実は同一要素の参照で,
hogeするたびにフレッシュな値が返ってくる仕様.
Re:初ハマり (スコア:2)
もうJavaでLambdaが実装されましたっけ?と思ったのですがもしかしてJavaではなくScalaでしょうか。iterator.map(hoge)がつかるようになるとJavaも気持ちよくかけそうなんですけどね。
Re:初ハマり (スコア:1)
#2299417 [srad.jp] は Scala のコードみたいですね。 Java で Lambda が実装されるのは次のバージョン (Java 8) です。匿名クラスのインスタンスを作るのと似たような感じで使えるものになる予定 [hatena.ne.jp]です。
一応今でも、 Google Guava ライブラリの Iterators#transform [googlecode.com] を使えば可能です。こんな感じで (コンパイルも通してませんが) 。
これが、 Java 8 の Lambda を使うとこんな感じになるはず。
Re:初ハマり (スコア:2)
コメントありがとうございます。
うーん、どちらもScalaやC♯とかをみてしまうと微妙ですね。
JVM系言語であれば、既存のJavaのライブラリを使用しつつ素直にScalaやGroovy(もしくはClojure)を使うのがよいのかもしれませんね。
ということで、今年こそScalaの勉強をしないと…。