#Scala のStreamとIterator

5
kmizu @kmizu

Stream.continually よりも Iterator.contiually を勧めたケースの方がいい気がしてくる今日この頃。

2012-11-22 12:34:53
がくぞ @gakuzzzz

@kmizu Iterator って本質的には mutable なモノだからそっちを推奨しちゃうのは怖い印象ありますね。Iterable に continually があればまた違うのかもですが。

2012-11-28 14:54:48
がくぞ @gakuzzzz

Iterator[A] {def hasNext: Boolean; def next: (A, Iterator[A])} みたいな interface だったら immutable にできるけど。

2012-11-28 14:56:56
Kenji Yoshida @xuwei_k

@gakuzzzz @kmizu 「それぞれの要素を1回しか使わないならIteratorでいいし、2回以上使う可能性があるならStream」って自分の中では明確な使い分けの基準がありますけどそういう単純な話でもないんですか?I

2012-11-28 15:16:48
Kenji Yoshida @xuwei_k

@gakuzzzz あと、Iteratorがmutableで怖いといっても、自分の場合continuallyでIterator作成したら、その後変数束縛せずに、すぐmapとかtakeWhileしてメソッドチェーンして処理して使いきってしまうことが多いのでそんなに問題にならない気が

2012-11-28 15:18:37
がくぞ @gakuzzzz

@xuwei_k @kmizu Iteratorって何か集合があってその集合を走査するための反復子ってイメージなので、集合が存在しない反復子というのは抵抗ある感じ。反復子を集合として扱う事に違和感があるというか。Iteratorパターンの肝は集合と反復子が独立してる所だと思います

2012-11-28 15:26:54
がくぞ @gakuzzzz

@gakuzzzz @xuwei_k @kmizu 何かの Adapter として Iterator インターフェイスを使う、っていう話なら Iterator だけ存在してるのもわかるのですが。

2012-11-28 15:27:41
がくぞ @gakuzzzz

@xuwei_k ええ、実際に問題になることはほぼ無いとは思います。単に引数型にList使うならSeqの方が抽象度高くて望ましく?みたいなそういうレベルでのStream>Iterator感ですね。

2012-11-28 15:31:27
Kenji Yoshida @xuwei_k

@gakuzzzz たしかに型というか、(mutableでないという意味での)安全面はStreamのほうが便利ですけど、Streamだとメモリずっと保持したり、この部分で余計なlockの処理かかる https://t.co/zVJnQwD6 という意味で、使い分けが・・・

2012-11-28 15:34:41
kmizu @kmizu

@xuwei_k @gakuzzzz 自分の使い方も @xuwei_k さんと同じような感じですね。Iteratorをそのまま保持する使い方はまずしなくて、コレクションにする場合でも、チェーンの最終的にtoSeqかtoListします。

2012-11-28 15:41:41
kmizu @kmizu

@gakuzzzz @xuwei_k 一般論としてはわかるんですが、continuallyって本質的に副作用を前提にしたメソッドなので、StreamよりもIteratorの方が自然な気はしてます。あと、Streamの場合、メモリを消費してるというのが忘れ去られがちという話が。

2012-11-28 15:43:58
がくぞ @gakuzzzz

@xuwei_k あー確かにパフォーマンス的に考えると Iterator の方がいい局面多そうですね。やっぱ使い分け基準をはっきりさせるって方が重要ですね。

2012-11-28 15:50:21
kmizu @kmizu

@gakuzzzz @xuwei_k はい。オリジナルの「Iteratorパターン」としての本質はそこにあると思うのですが、Iterator.continually は副作用のある処理の反復を表現するのに適しているから使っちゃえというイメージです。

2012-11-28 15:53:49
がくぞ @gakuzzzz

@kmizu @xuwei_k あ、そっか。iterate と違って continually は副作用前提ですね。確かにそれなら Iterator の方が自然な気がしてきました。パフォーマンス的な側面では確かに Iterator の方が軍配あがりますよね……。

2012-11-28 15:54:50
Kenji Yoshida @xuwei_k

「オリジナルのIteratorパターン」の話がもうなんだか全然ピンと来ない程度に、自分がオブジェクト指向というかデザインパターンがあれ

2012-11-28 15:55:36
kmizu @kmizu

@gakuzzzz @xuwei_k @kmizu あと、(Scalaの)Iteratorは別にIterableに依存してるわけじゃないので、GoFのIteratorパターンにこだわる必要はないんじゃとも思います。

2012-11-28 15:56:19
がくぞ @gakuzzzz

@kmizu @xuwei_k Javaの Iterator も Iterable に依存はしてないですよね。Iterable が Iterator に依存してるだけで。確かにこだわる必要は無いのですが、名前からくる暗黙的なお約束ってありそうな気がします

2012-11-28 16:02:09
Kenji Yoshida @xuwei_k

適当に見つけたのをtweet http://t.co/UWpk0KUT "Stream vs Views vs Iterators" http://t.co/0Vn0TNhP "Difference between Iterator and Stream in Scala?"

2012-11-28 16:09:16
kmizu @kmizu

@gakuzzzz @xuwei_k 確かに >JavaのIteratorも ただ、ScalaのIteratorはcontinually,fill,tabulateなど、Iterator単体を生成するユーティリティメソッドが多数あるので、独立した存在として捉えるのはありかなと。

2012-11-28 16:10:08
がくぞ @gakuzzzz

つまり何が言いたいかといと、PHPのArrayが自分自身でどこまで走査したかを管理していて反復子と集合が独立していないのでクソということ。

2012-11-28 16:08:05