为什么我不能在Option [List]

时间:2016-01-23 23:10:13

标签: scala collections

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相同?

2 个答案:

答案 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]

您可以强制OptionIterable强制隐式申请:

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,这样您就可以保证里面至多有一件东西。