我是新手Scala,正在尝试找出过滤和映射集合的最佳方法。这里有一个玩具示例来解释我的问题。
方法一: 这很糟糕,因为我要两次迭代列表,并在每次迭代中计算相同的值。
那么,有没有可能在不重复计算的情况下只遍历一次集合来计算这个值呢?
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
在列表长度超过一千个元素时会导致堆栈溢出。此外,Scalaz 版本与flatMap
相比没有任何优势。 - Rex Kerr