当我尝试
Some(1).flatMap(_ => List(2))
我明白了
error: type mismatch;
found : List[Int]
required: Option[?]
但做Some(1).map(_ => List(2)).flatten
的工作。为什么我在第一种情况下会出现编译错误?
当我尝试
Some(1).flatMap(_ => List(2))
我明白了
error: type mismatch;
found : List[Int]
required: Option[?]
但做Some(1).map(_ => List(2)).flatten
的工作。为什么我在第一种情况下会出现编译错误?
如果您确定列表中有零个或一个元素,您可以这样做:
option.flatMap(_ => list.headOption)
你不能这样做,因为类型系统禁止这样做。Option.flatMap 的类型是
final def flatMap[B](f: (A) ⇒ Option[B]): Option[B]
所以你的函数必须返回一个 Option 类型,而不是 List 类型。
如果要转换为其他类型,则必须使用 .map(...).flatten
并不是说它不适用于其他 Scala 版本,但它不适用于我:
scala> Some(1).map(_ => List(2)).flatten
<console>:8: error: Cannot prove that List[Int] <:< Option[B].
Some(1).map(_ => List(2)).flatten
^
更重要的是Some("abc").flatMap(s => s.toList)
, 或等效的结果是Some(List('a','b','c')).flatten
什么?