任何人都可以帮助这个
Scala新手?以前,我们将这些数量的实体列表中的数量相加:
sum = entities.foldLeft(0.0)(_ + _.quantity)
现在数量是Option [Double],总和也是这样.如何使用惯用的Scala进行转换?
如果任何实体的数量为无,则总和也应为无.
否则总和应为(总计).
编辑:把这个东西放在单元测试中,以便我可以尝试所有的答案.请注意,如果任何数量为无,我确实需要结果为“否”,因为缺少的数量意味着我们还没有完成,所以总数应该反映出来.即使你没有得到正确的答案,如果你帮助我或其他人,或帮助我学习新的东西,我会upVote.
解决方法
您可以使用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.