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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- scala – Lift Web框架的开源应用
- scala – 为什么这个Spark代码会产生NullPointerException?
- shell处理mysql增、删、改、查
- docker – 简单的Flume代理在登录控制台时会有些滞后
- angularjs – 为什么我不能在我的config()中注入$location?
- scala – Slick 3.0.0选择并创建或更新
- angular – ngrx store 4选择不工作
- 搭建 AngularJS+Ionic+Cordova 开发环境并运行一个demo
- AngularJS 模版 - Angular Templates
- 不一样的SQL监控,使用perfomance schema填补slow log的空白