「Option型=コレクション」と考えてみると、
謎なのがmapとflatMapですの。
結論から言うと、flatMapの挙動が斜め上なんですの。
コード
val list = List(List(1,2), List(1,2))
val opt = Option(list)
println(opt.flatMap(n => Option(n)))
println(opt.map(n => n))
結果
Some(List(List(1, 2), List(1, 2)))
Some(List(List(1, 2), List(1, 2)))
なんとなく、flatMapなら「Some(List(1, 2, 1, 2))」となりそうなものですけど、mapの結果と一緒なのですの。
Option型のmapとflatMapの違いはたぶん、関数の定義が微妙に違うだけなんですの。
map [B] (f: (A) ⇒ B ): Option[B]
flatMap [B] (f: (A) ⇒ Option[B]): Option[B]
Scala API(*)の説明もこんな口ぶりですの。
原文:Slightly different from map in that f is expected to return an Option (which could be None).
意訳:fがOption(Noneの可能性も有り)を返すことになっているという点でmapとわずかに異なる
その微妙な引数の差を、あえてmapとflatMapという名前で区別する意味がわかりませんの。ぷんすかぷん
*)Optionのページ (2.9.1 final)
たとえばmap。これって、よくコレクションにつかうメソッドですの。
でも、そういうメソッドが、実はOption型にも付いてるんですの。(たくさん!)
Option型を使う場合、基本的にはmatchを使って中身を調べるのですけど、それをさぼる方法もいっぱい用意されてますの。きっと、コレクション操作メソッドもその一つですの。
これを使うと、Option型の処理をコレクション操作の中に自然に織り込めるという点で、とっても素敵なのですの。
よく見かけるのは、foreachを使う方法ですの。でも、mapなら値が返ってくるので、より関数型ちっくな書き方ができますの。この辺の選択基準は、コレクションを扱うときと同じですの。
mapやforeachの他にも、filterやcollectなんかもあって、果てはイテレータまで取れるので、もうコレクションの一種だと思ってしまってもいいくらいですの。
ただ、実際のところ、コレクションとは継承関係の繋がりは一切無くて、あくまで同名の専用メソッドを用意しているだけのようなので、全く同じように使えるわけでは無いのですの。ちょっと注意ですの。
それがハッキリわかるのが、mapとflatMapの動作で、次回はそれについてですの。
でも、そういうメソッドが、実はOption型にも付いてるんですの。(たくさん!)
Option型を使う場合、基本的にはmatchを使って中身を調べるのですけど、それをさぼる方法もいっぱい用意されてますの。きっと、コレクション操作メソッドもその一つですの。
これを使うと、Option型の処理をコレクション操作の中に自然に織り込めるという点で、とっても素敵なのですの。
よく見かけるのは、foreachを使う方法ですの。でも、mapなら値が返ってくるので、より関数型ちっくな書き方ができますの。この辺の選択基準は、コレクションを扱うときと同じですの。
mapやforeachの他にも、filterやcollectなんかもあって、果てはイテレータまで取れるので、もうコレクションの一種だと思ってしまってもいいくらいですの。
ただ、実際のところ、コレクションとは継承関係の繋がりは一切無くて、あくまで同名の専用メソッドを用意しているだけのようなので、全く同じように使えるわけでは無いのですの。ちょっと注意ですの。
それがハッキリわかるのが、mapとflatMapの動作で、次回はそれについてですの。
登録:
投稿 (Atom)