”Java8のStreamを使いこなす”に関する議論

下記の記事に関して、著者の @kis さんのご発言等。 Java8のStreamを使いこなす (http://d.hatena.ne.jp/nowokay/20130504#1367702641) Java8のStreamの目的と書きやすさや可読性、並行処理の効果について (http://d.hatena.ne.jp/nowokay/20130506#1367793849)
5
きしだൠ(K1S) @kis

@makotan 出力処理とzip を分けなくていいとしても、改めて{}でくくって行をわけてreturnを追加して無意味な値返すのは、綺麗じゃないよー

2013-05-06 09:14:07
きしだൠ(K1S) @kis

@makotan nameとバインドしたMap.Entryでも返す?それはそれで・・・

2013-05-06 09:19:12
きしだൠ(K1S) @kis

@makotan Map.Entryがもっと扱いやすい名前になってれば・・・AbstractMap.SimpleEntryとか、ぜんぜんSimpleじゃない!

2013-05-06 09:26:38
きしだൠ(K1S) @kis

@makotan まあ、ここでTimeUnit使う場合の解は、intRangeをtoSecondsで囲むってことになるなー

2013-05-06 09:27:46
きしだൠ(K1S) @kis

@makotan 最初から書いてれば、それでよかったんだけどもw いまとなってはそれをintRangeの前に付け加えるのは野暮ったい

2013-05-06 09:30:20
きしだൠ(K1S) @kis

@makotan エラーパターンと成功パターンを意識する必要があるのはavarageがOptionalを返すってだけで、Streamの問題じゃない気が。むしろ、マジで書くならOptionalが返るほうがいいと思うよ。

2013-05-06 09:34:08
きしだൠ(K1S) @kis

@makotan いままで出てきてないコンテキストを省略して書かれても困るぞよ

2013-05-06 09:38:43
きしだൠ(K1S) @kis

@makotan それでいうなら、パターンマッチがないのがそもそも問題なんで、まあその意味でJavaが使いやすくはならんだろうね

2013-05-06 09:41:49
きしだൠ(K1S) @kis

@makotan パターンマッチだけあれば、あとはユーティリティクラスとメソッド実装の問題なんだけど、さすがに互換性くずさずにパターンマッチ入れるのは無理やねー。これはScalaとJavaの違いとしていつまでも残ると思う。

2013-05-06 09:46:19
きしだൠ(K1S) @kis

結局のところ、JavaとScalaの違いというのは、パターンマッチがあるかどうかなんだよなー。こればかりは、互換性を保ったままJavaに導入することはできない。あとは「冗長だけど書けるよ!」となるけど。

2013-05-06 09:48:53
きしだൠ(K1S) @kis

@poad1010 メソッドで書けばいいです。

2013-05-06 09:52:45
ゆめかけ: 猫にまっしぐら @poad1010

@kis まぁ、そうすれば書けはしますが、数値だけ別扱いというのも… 要するに、痒い所に手が届く(冗長を排除出来る)か否かも、以外と大きいとは思うんですけどね

2013-05-06 09:55:33
きしだൠ(K1S) @kis

@poad1010 それは、結局シンタックスシュガーを導入するかどうかっていう、メリット・デメリットのバランスの話でしかないと思います。メリットが大きければ入るし、それほどメリットがなければ入らない、という。

2013-05-06 09:59:53
ゆめかけ: 猫にまっしぐら @poad1010

@kis 確かにそうですが、あったほうが記述量が少なくて済む(その分、多少なりとも別の作業に注力する時間が作りやすくなる)と思うので、導入して欲しいところですが… あ、論点からずれてしまっていますね。すみません。

2013-05-06 10:03:16
きしだൠ(K1S) @kis

@poad1010 演算子オーバーロードがあるかどうかで、プログラムの構造は変わらないんですよねぇ。記述も補完きくから時間くわないしタイプ量もないし。でもパターンマッチはプログラムの構造を変えるし、データ構造の分解ができるのは作業時間にも影響あります。

2013-05-06 10:09:54
ゆめかけ: 猫にまっしぐら @poad1010

@kis 演算子のオーバーロードではそうですね。見てくれの問題です。 糖衣構文のお話が出てきたので、そっちにフォーカスずらしてしまいました。すみません。 パターンマッチは仰るとおりだと思います。 あと、先ほど言いたかったのは、匿名クラスは糖衣構文使わないと読みづらくなり易い

2013-05-06 10:14:41
きしだൠ(K1S) @kis

@poad1010 一方でパターンマッチには「すべてのパターンが対策される」というのを保証する機能があって、これは後付ではどうともしがたいです。データ構造の分解というのも、似て非なるものなら作れるだろうけど。

2013-05-06 10:28:27
きしだൠ(K1S) @kis

演算子オーバーロードとかは、たとえばNetBeansがBigDecimalへの+入力をaddメソッドに変換してくれて、表示も+となれば実用上問題なかったりする。記述の問題というのは、やるかやらないか、どの層でやるかの問題で、そこまで本質的な問題じゃない。

2013-05-06 10:40:33
きしだൠ(K1S) @kis

「Streamを使った処理のほうが明らかに見やすい」というけど、たとえばベンチマーク処理の部分、「i -> bench(proc, data)」の処理の最初3回が、ほんとに実行されるか自信もっていえるかって話で。最適化されて実行されなかったりしないか、と。今回は確認してるけど。

2013-05-06 12:23:59
(call me #'knjname) @knjname

@kis 遅延評価リストみたいなのだと正格評価を強制するdoAll()なのが必要ですかね

2013-05-06 12:35:18
きしだൠ(K1S) @kis

@knjname そういうのがあるところで、やはり処理の行われ方がメソッドの暗黙の仕様に基づくことに変わりなくて、コード記述だけからはどのように処理されるか読み取れないのですよねぇ。

2013-05-06 12:40:01