Scala 选项上的flatmap(GenTraversableOnce)
这不起作用:Scala 选项上的flatmap(GenTraversableOnce),scala,Scala,这不起作用: val res = myOption flatMap (value => Seq(value, “blo”)) 但这是肯定的: val res = myOption.toSeq flatMap (value => Seq(value, “blo”)) 你不认为Options上的flatMap应该像Seq一样使用gentraversableone吗? 或者此代码不利于可读性,我应该使用匹配或映射/getOrElse 编辑:我们在/产量上也得到了同样的问题 Cheers
val res = myOption flatMap (value => Seq(value, “blo”))
但这是肯定的:
val res = myOption.toSeq flatMap (value => Seq(value, “blo”))
你不认为Option
s上的flatMap
应该像Seq
一样使用gentraversableone
吗?或者此代码不利于可读性,我应该使用
匹配
或映射
/getOrElse
编辑:我们在/产量
上也得到了同样的问题
Cheers
选项。flatMap
返回一个选项,该选项与序列“类似”,但不能包含多个元素。如果允许它接受一个函数,该函数返回一个Seq
,并且它返回一个包含多个元素的Seq
,那么flatMap
的返回值是多少(请记住,它需要是一个选项
)
为什么flatMap
首先需要返回一个选项?好吧,所有的flatMap
实现都返回它们开始时使用的相同类型。这是有道理的:如果我有一个选项
,并且想以某种方式转换内容,最常见的用例是我想以另一个选项
结束。如果flatMap
返回给我一个Seq
,我会怎么做<代码>头选项
?这不是一个很好的主意,因为它可能会悄悄地丢弃数据<代码>如果(seq.size<2)seq.headOption else抛出….?好吧,这稍微好一点,但看起来很难看,并且在编译时无法强制执行
另一方面,当您需要时,将
选项
转换为Seq
非常简单且完全安全:只需执行.toSeq
Option.flatMap
返回一个选项,该选项“类似”一个序列,但不能包含多个元素。如果允许它接受一个函数,该函数返回一个Seq
,并且它返回一个包含多个元素的Seq
,那么flatMap
的返回值是多少(请记住,它需要是一个选项
)
为什么flatMap
首先需要返回一个选项?好吧,所有的flatMap
实现都返回它们开始时使用的相同类型。这是有道理的:如果我有一个选项
,并且想以某种方式转换内容,最常见的用例是我想以另一个选项
结束。如果flatMap
返回给我一个Seq
,我会怎么做<代码>头选项
?这不是一个很好的主意,因为它可能会悄悄地丢弃数据<代码>如果(seq.size<2)seq.headOption else抛出….?好吧,这稍微好一点,但看起来很难看,并且在编译时无法强制执行
另一方面,当您需要时,将
选项
转换为Seq
非常简单且完全安全:只需执行.toSeq
flatMap的总体语义是类似于方法,这意味着它倾向于类似于签名
[A]this:T[A].flatMap[B](f: A => T[B]): T[B]
有时(SeqLike
)此签名被推广到
[A]this:T[A].flatMap[B](f: A => F[B]): T[B]
其中F[B]
是一种很容易转换为T[B]
因此,不仅选项
,而且并发.Future
,util.Try
和-extension-syntax for scalaz monad都有方法flatMap
,该方法不接受任何可遍历,但只接受相同的包装类型
也就是说,
flatMap
更多的是来自monads世界,而不是来自collectionsflatMap的总体语义是像方法一样工作,这意味着它倾向于像签名一样工作
[A]this:T[A].flatMap[B](f: A => T[B]): T[B]
有时(SeqLike
)此签名被推广到
[A]this:T[A].flatMap[B](f: A => F[B]): T[B]
其中F[B]
是一种很容易转换为T[B]
因此,不仅选项
,而且并发.Future
,util.Try
和-extension-syntax for scalaz monad都有方法flatMap
,该方法不接受任何可遍历,但只接受相同的包装类型
也就是说,
flatMap
更多的是来自monads world,而不是来自collections“记住它需要成为一个选项”为什么?为什么我可以做Seq().flatMap(Option())
,但反过来不行?如果它使用GenTraversableOne,它将处理所有收集,包括Options@Joan我在回答中添加了对您评论的回应非常好的回答谢谢@Dima。我现在了解了问题的各个方面。“记住它需要成为一个选项”为什么?为什么我可以做Seq().flatMap(Option())
,但反过来不行?如果它使用GenTraversableOne,它将处理所有收集,包括Options@Joan我在回答中添加了对您评论的回应非常好的回答谢谢@Dima。我现在了解了问题的各个方面。