println(List(List(1,2,3)).flatMap(identity))
= List(1,2,3)
println(Iterable(List(1,2,3)).flatMap(identity))
相同的结果
println(Option(List(1,2,3)).flatMap(identity))
Error:(8, 39) type mismatch;
found : List[Int] => List[Int]
required: List[Int] => Option[?]
println(Option(List(1,2,3)).flatMap(identity))
^
^
我认为有一个option2iterable隐式转换,所以Options的行为与Iterable相同?
答案 0 :(得分:7)
Option
伴侣中有一个隐式定义:
/** An implicit conversion that converts an option to an iterable value
*/
implicit def option2Iterable[A](xo: Option[A]): Iterable[A] = xo.toList
但在这种情况下不适用,因为Option
有自己的flatMap
方法。
def flatMap[B](f: A => Option[B]): Option[B]
您可以强制Option
到Iterable
强制隐式申请:
scala> (Option(List(1, 2, 3)): Iterable[List[Int]]).flatMap(identity)
res0: Iterable[Int] = List(1, 2, 3)
或者只是致电.toIterable
:
scala> Option(List(1, 2, 3)).toIterable.flatMap(identity)
res1: Iterable[Int] = List(1, 2, 3)
答案 1 :(得分:1)
那么,您期望flatMap
的输出是什么?你不能拥有Option(1,2,3)
,可以吗?您只能拥有Option
一件事,因此,您传递给.flatMap
的函数必须返回Option
,而不仅仅是Iterable
,这样您就可以保证里面至多有一件东西。