Scala中map方法和foreach方法的区别是什么?

15

在我开始编写Scala代码时,我有一个疑问:想知道Scala中的map方法是如何工作的,它是按顺序处理还是多线程处理?更重要的是,我想知道为什么map方法比whileforeach更快?

val list = List(1,2,3,45,12)
list.map(x => x)
list.foreach(x => println(x))

4
你怎么知道mapforeach更快? - Jatin
5
实际上,“foreach”应该比“map”快,因为在这种情况下,“map”内部构建了一个“列表”,而“foreach”没有构建。任何脚本都会显示“foreach”更快。 - Jatin
我进行了代码测试,结果表明在Scala中使用for表达式(即map)比foreach或while等方式更快。 - Kishore Karunakaran
@Jatin:你不觉得println需要更多时间来执行(因为它是一个系统调用),而简单的对象创建只会触发GC(如果GC管理的堆足够大)吗? - kiritsuku
1个回答

31
首先,这两个操作是完全不同的。`map` 是指给定一个函数 `A => B`,对列表进行转换,而 `foreach` 产生 `Unit` 并且通常用于产生副作用。
我猜测 `foreach` 在执行所需的周期方面比 `map` “更快”,因为 `map` 创建了一个新集合(在这种情况下)作为函数结果。但是比较这两个功能就像比较苹果和橙子一样,并没有可比性。
只有在调用它的集合是并行集合时,`map` 才会并行化。所以在你的例子中:
list.map(x => x)

不是并行的,而是顺序的,但是

list.par.map(x => x)

应该是并行的。显然,这种用法需要考虑各种警告。同样的并行集合也有一个 foreach 方法。


简单、简短、精确。太棒了.. :) - Archit
很好地解释了。 - kush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接