Scala:在一次迭代中过滤和映射的最佳方式
发布时间:2020-12-16 19:20:32 所属栏目:安全 来源:网络整理
导读:我是 Scala的新手,并试图找出过滤器的最佳方法.映射集合.这是一个解释我的问题的玩具示例. 方法1:这非常糟糕,因为我在列表中迭代两次并在每次迭代中计算相同的值. val N = 5val nums = 0 until 10val sqNumsLargerThanN = nums filter { x: Int = (x * x) N
我是
Scala的新手,并试图找出过滤器的最佳方法.映射集合.这是一个解释我的问题的玩具示例.
方法1:这非常糟糕,因为我在列表中迭代两次并在每次迭代中计算相同的值. val N = 5 val nums = 0 until 10 val sqNumsLargerThanN = nums filter { x: Int => (x * x) > N } map { x: Int => (x * x).toString } 方法2:这稍微好一些,但我仍然需要计算两次(x * x). val N = 5 val nums = 0 until 10 val sqNumsLargerThanN = nums collect { case x: Int if (x * x) > N => (x * x).toString } 那么,是否有可能计算这个而不重复两次收集并避免重复相同的计算? 解决方法
可以使用foldRight
nums.foldRight(List.empty[Int]) { case (i,is) => val s = i * i if (s > N) s :: is else is } foldLeft也会达到类似的目标,但结果列表的顺序会相反(由于foldLeft的相关性). 或者,如果你想和Scalaz一起玩 import scalaz.std.list._ import scalaz.syntax.foldable._ nums.foldMap { i => val s = i * i if (s > N) List(s) else List() } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |