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

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()
}

(编辑:李大同)

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

    推荐文章
      热点阅读