scala – 如何转换foldLeft:Double表达式使用Option [Double]?

任何人都可以帮助这个 Scala新手?以前,我们将这些数量的实体列表中的数量相加:

sum = entities.foldLeft(0.0)(_ + _.quantity)

现在数量是Option [Double],总和也是这样.如何使用惯用的Scala进行转换?

如果任何实体的数量为无,则总和也应为无.
否则总和应为(总计).

编辑:把这个东西放在单元测试中,以便我可以尝试所有的答案.请注意,如果任何数量为无,我确实需要结果为“否”,因为缺少的数量意味着我们还没有完成,所以总数应该反映出来.即使你没有得到正确的答案,如果你帮助我或其他人,或帮助我学习新的东西,我会upVote.

编辑:@ sepp2k赢得一个工作解决方加上解释.感谢所有的学习!

解决方法

您可以使用Option的flatMap和map方法组合两个选项,以便如果两个选项为Some(x)和Some(y)或否,则结果将为Some(f(x,y)).

entities.foldLeft(Some(0.0):Option[Double]) {
    (acco,x) => acco.flatMap(acc => x.quantity.map(_ + acc))
}

编辑响应您的意见:

以下是一个示例用法

scala> case class Foo(quantity:Option[Double]) {}
defined class Foo
scala> val entities: List[Foo] = List(Foo(Some(2.0)),Foo(Some(1.0)),Foo(None))
scala> entities.foldLeft(Some(0.0):Option[Double]) {
    (acco,x) => acco.flatMap(acc => x.quantity.map(_ + acc))
}
res0: Option[Double] = None

scala> val entities: List[Foo] = List(Foo(Some(2.0)),Foo(Some(1.0)))                                  
scala> entities.foldLeft(Some(0.0):Option[Double]) {
    (acco,x) => acco.flatMap(acc => x.quantity.map(_ + acc))
}
res1: Option[Double] = Some(3.0)

所以是的,如果任何实体是None,它将返回None.

关于map和flatMap:

map的函数f为类型A => B并返回Some(x)的一些(f(x)),对于None返回None.

xo.flatMap(f),其中f是类型A =>的函数选项[B]和xo是一个选项[A],返回Some(y)iff xo是Some(x),f(x)是Some(y).在所有其他情况下(即如果xo为None或f(x)为None),则返回None.

所以acco.flatMap(acc => x.quantity.map(_ acc))的表达式返回y acc iff x.quantity是Some(y),acco是Some(acc).如果x.quantity和acco中的一个或者两个都是None,结果将不是.因为这是一个折叠,这意味着对于下一次迭代,acco的值也将为None,因此最终结果将为None.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...