Dima:Scala中高效且可组合的 foreach

目标:有效地为列表中的每个元素做一些事情,然后返回原始列表,这样我就可以用原始列表做其他事情。例如,让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 中执行此操作的正确方法是什么?

2

最简单的方法似乎是:

    lst.foreach(many_operations)
    lst.foreach(something_else)

但是:使用副作用真的不是一个好主意,我会敦促您重新审视您的设计,以使用显式的纯转换,而不是副作用和突变。

为了解决同时在内存中有多个列表的问题,您可以使用viewiterator来模拟流处理,并丢弃不需要再次使用的中间结果:

   val newList = lst.iterator
    .map(foo)
    .map(bar)
    .map(baz)
    .toList

lst会得到垃圾收集,如果你不再次引用它)。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(779)
Centos进入root权限:/bin/su:CentOS中拒绝的权限无法设置su-root
上一篇
Framework3.5:.NETFramework 3.5位置
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(3条)