好吧,这更像是一个计算机科学问题,而不是一个基于特定语言的问题,但是map操作和foreach操作之间有区别吗?或者它们只是同一事物的不同名称?
当前回答
ForEach尝试在RDD的每个元素上应用一个函数,比如写入db等,而不返回任何东西。
但是map()在rdd的元素上应用一些函数并返回rdd。所以当你运行下面的方法时,它不会在第3行失败,但在应用foreach后收集rdd时,它会失败并抛出一个错误
文件"<stdin>",第5行,在<模块> AttributeError: 'NoneType'对象没有collect属性
nums = sc.parallelize([1,2,3,4,5,6,7,8,9,10])
num2 = nums.map(lambda x: x+2)
print ("num2",num2.collect())
num3 = nums.foreach(lambda x : x*x)
print ("num3",num3.collect())
其他回答
不同。
Foreach遍历一个列表,并对每个列表成员执行一些具有副作用的操作(例如将每个成员保存到数据库中)
Map遍历一个列表,转换该列表的每个成员,并返回另一个具有已转换成员的相同大小的列表(例如将字符串列表转换为大写)
它们之间的重要区别是map将所有结果累积到一个集合中,而foreach不返回任何结果。Map通常用于使用函数转换元素集合,而foreach只是为每个元素执行一个操作。
如果你特别谈论Javascript,区别在于map是一个循环函数,而forEach是一个迭代器。
当您希望对列表的每个成员应用操作并将结果作为新列表返回时,使用map,而不影响原始列表。
当您想在列表的每个元素的基础上做一些事情时,请使用forEach。例如,您可能正在向页面添加内容。从本质上讲,当你想要“副作用”时,它是很好的。
其他区别:forEach不返回任何内容(因为它实际上是一个控制流函数),传入函数获得对索引和整个列表的引用,而map返回新的列表,只传入当前元素。
简单的回答:map和forEach是不同的。另外,非正式地说,map是forEach的严格超集。
长回答:首先,让我们提出forEach和map的一行描述:
forEach遍历所有元素,在每个元素上调用所提供的函数。 Map遍历所有元素,在每个元素上调用所提供的函数,并通过记住每个函数调用的结果来生成转换后的数组。
在许多语言中,forEach通常被称为each。下面的讨论使用JavaScript仅供参考。它真的可以是任何其他语言。
现在,让我们分别使用这些函数。
使用forEach:
任务1:编写printSquares函数,该函数接受数字数组arr,并打印其中每个元素的平方。
解决方案1:
var printSquares = function (arr) {
arr.forEach(function (n) {
console.log(n * n);
});
};
使用地图:
任务2:编写一个函数selfDot,它接受一个数字数组arr,并返回一个数组,其中每个元素都是arr中相应元素的平方。
旁白:在这里,在俚语中,我们试图平方输入数组。正式地说,我们试着计算它与自身的点积。
解决方案2:
var selfDot = function (arr) {
return arr.map(function (n) {
return n * n;
});
};
map如何是forEach的超集?
您可以使用map来解决任务1和任务2。但是,您不能使用forEach来解决任务2。
在解决方案1中,如果简单地用map替换forEach,解决方案仍然有效。然而,在解决方案2中,用forEach替换map将破坏之前的工作解决方案。
在map方面实现forEach:
实现map优势的另一种方法是根据map实现forEach。由于我们是优秀的程序员,我们不会沉迷于名称空间污染。我们将调用forEach。
Array.prototype.each = function (func) {
this.map(func);
};
现在,如果你不喜欢毫无意义的原型,你可以这样做:
var each = function (arr, func) {
arr.map(func); // Or map(arr, func);
};
所以,嗯. .forEach为什么会存在?
答案是效率。如果您对将一个数组转换为另一个数组不感兴趣,为什么要计算转换后的数组呢?只是为了把它扔掉?当然不是!如果你不想做变换,你就不应该做变换。
因此,虽然map可以用于解决任务1,但它可能不应该使用。因为每个人都是正确的候选人。
最初的回答:
虽然我在很大程度上同意@madlep的回答,但我想指出map()是forEach()的严格超集。
是的,map()通常用于创建一个新数组。但是,它也可以用来改变当前数组。
这里有一个例子:
var a = [0, 1, 2, 3, 4], b = null;
b = a.map(function (x) { a[x] = 'What!!'; return x*x; });
console.log(b); // logs [0, 1, 4, 9, 16]
console.log(a); // logs ["What!!", "What!!", "What!!", "What!!", "What!!"]
在上面的例子中,a被方便地设置为a[i] === i对于i < a.length。尽管如此,它还是展示了map()的强大功能。
下面是map()的官方描述。注意map()甚至可能改变调用它的数组!冰雹(地图)。
希望这对你有所帮助。
编辑2015年11月10日:增加详细说明。
最“明显”的区别是map将结果累积到一个新的集合中,而foreach仅用于执行本身。
但这里有一些额外的假设:因为map的“目的”是新的值列表,所以执行顺序并不重要。事实上,一些执行环境会生成并行代码,甚至引入一些记忆来避免调用重复值,或者引入惰性来避免调用一些值。
另一方面,Foreach是专门用于副作用的;因此顺序很重要,而且通常不能并行。
推荐文章
- foreach和map有区别吗?
- 使用c++ 11的基于范围的正确方法是什么?
- 设计模式:工厂vs工厂方法vs抽象工厂
- 我如何应用for-each循环到字符串中的每个字符?
- 在PHP中使用foreach循环时查找数组的最后一个元素
- 为什么处理排序数组比未排序数组慢?
- 构造函数何时抛出异常是正确的?
- 什么是“一级”对象?
- 什么时候应该使用Debug.Assert()?
- 为什么浮点数不准确?
- 我在PHP中有2个日期,我如何运行foreach循环来遍历所有这些日子?
- IOException:进程不能访问文件“文件路径”,因为它正在被另一个进程使用
- 地图和字典的区别是什么?
- 跳跃表vs.二叉搜索树
- Kotlin中的' forEach '中的' break '和' continue '