目标:有效地为列表中的每个元素做一些事情,然后返回原始列表,这样我就可以用原始列表做其他事情。例如,让lst
是一个非常大的列表,假设我们在应用我们的 foreach 之前对它做了很多操作。我想做的是这样的:
lst.many_operations().foreach(x =>f(x)).something_else()
然而,foreach
返回一个单元。我寻求一种方法来遍历列表并返回提供的原始列表,这样我就可以对它做something_else()
。为了减少内存影响,我需要避免将lst.many_operations()
的结果保存到一个变量中。
一个明显但不完美的解决方案是将foreach
替换为map
。然后代码如下所示:
lst
.many_operations()
.map(x => {
f(x)
x
}).something_else()
但是,这并不好,因为map
构造了一个新列表,有效地复制了它迭代的非常大的列表。
在 Scala 中执行此操作的正确方法是什么?
最简单的方法似乎是:
lst.foreach(many_operations)
lst.foreach(something_else)
但是:使用副作用真的不是一个好主意,我会敦促您重新审视您的设计,以使用显式的纯转换,而不是副作用和突变。
为了解决同时在内存中有多个列表的问题,您可以使用view
或iterator
来模拟流处理,并丢弃不需要再次使用的中间结果:
val newList = lst.iterator
.map(foo)
.map(bar)
.map(baz)
.toList
(lst
会得到垃圾收集,如果你不再次引用它)。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(3条)