加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 19:06:43 所属栏目:安全 来源:网络整理
导读:任何人都可以帮助这个 Scala新手?以前,我们将这些数量的实体列表中的数量相加: sum = entities.foldLeft(0.0)(_ + _.quantity) 现在数量是Option [Double],总和也是这样.如何使用惯用的Scala进行转换? 如果任何实体的数量为无,则总和也应为无. 否则总和应
任何人都可以帮助这个 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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读