Scala中的集合对象都有foreach和map、flatMap方法,都是用来遍历当前集合,但他们都有不同点。
这几个方法的共同点在于:都是用于遍历集合对象,并对每一项执行指定的方法。
而他们的差异在于:foreach无返回值(准确说返回void),map返回集合对象,flatMap可以返回把嵌套的集合展开。
1.map
map的参数是一个函数,List中的每个元素都应用于这个函数,并且返回一个新的集合。
val names=List("a","b","c")
可以用
names.map(_.toUpperCase)
得到List("A","B","C")
2.foreach
foreach和map相似,只不过它没有返回值,foreach只要是为了对参数进行作用。
比如
names.foreach{name=>println(name)}
3.flatmap
接收一个可以处理嵌套列表的函数,然后把返回结果连接起来,将集合扁平化处理
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.master("local")
.appName("test")
.getOrCreate()
val sc = spark.sparkContext
val increase = (x: Int) => x + 1
val someNumbers = List(0, 1, 3, 5, 7, 9, 15)
val b = someNumbers.foreach(increase)
println(b.getClass)
val c = someNumbers.map(increase)
println(c.getClass)
c.foreach(println)
c.map(println)
println("=================")
val list = List("hello flink", "hello test", "hello test", "getClass hadoop", "world", "spark", "spark")
val res = sc.makeRDD(list)
res.flatMap(x => x.split(" "))
.map(x => (x, 1))
.reduceByKey(_ + _)
.foreach(println)
}
见如下代码及运行结果:b.getClass 得到的是void, 而c.getClass得到的是colletion 。foreach和map的运行结果一致。
结论就是:foreach 无法代替map. 而map方法却可以代替foreach
那为什么scala提供foreach和map两个方法呢?
scala做为一种支持函数式编程范式的语言,必然要引入一种机制以支持数学中函数概念,而在数学中函数就是映射,所以scala中有map方法一点都不奇怪。而foreach只是用在不需要对集合执行映射操作,但需要遍历集合时才用到。总而言之,foreach用于遍历集合,而map用于映射(转换)集合到另一个集合。
![](https://img-blog.csdnimg.cn/img_convert/df81b4838bc94549a38ff773d5360d40.png)