Scala中List的map和flatMap的区别

写在前面:map方法的核心是映射每个元素并进行操作后将结果保存为一个列表,最后汇集所有的结果列表作为列表元素形成一个新的列表

                  flatMap房的核心是先映射每个元素,然后进行操作,然后进行扁平化处理,最后汇集所有进行扁平化处理的结果集形成一个新的列表(扁平化:简而言之就是去除所有的修饰)

 

1.map的例子(摘自Scala编程)

Scala中List的map和flatMap的区别

2.map的例子(本人)

Scala中List的map和flatMap的区别

从上面的例子中可以看出,map只是将子元素遍历出来进行了操作(下面的例子可以帮助你更好的理解)

Scala中List的map和flatMap的区别

我们可以发现,只对一级子类进行操作处理(并不关心子类是什么类型)

3.flatMap的例子(摘自Scala编程)

Scala中List的map和flatMap的区别

4.flatMap的例子(本人)

Scala中List的map和flatMap的区别

从上可以看出,flatMap是先将子元素遍历出来,然后对子元素进行操作,然后进行扁平化处理(正如文章开头所定义的那样)。那么如果子元素也是列表呢?下面的例子来验证我们的想法

Scala中List的map和flatMap的区别

由上可以看出,flatMap执行扁平化时,如果其中一个子元素是List(a:Object,b:Object),会变成a,b  因为将这个子元素的元素打散,就是扁平化,但是a还是a,b还是b,不关心a或者b的类型。

简而言之:flatMap只执行一层扁平化,即子类元素扁平化,不会执行子类元素的子类元素的扁平化。
 

5.map与flatMap的区别例子

 Scala中List的map和flatMap的区别

观察上面两个例子,再看文章开头那句话,是不是对map和flatMap有了较清晰的认识?当然,还有一个小知识点如下图所示:

Scala中List的map和flatMap的区别

map方法会保留空list,因为空列表也是有意义的。但是在flatMap方法中,空列表进行扁平化后就不存在了,我们可以观察res43的List的数据类型和res44的数据类型。

 

6.flatMap并不一定用于元素是序列的列表,他只需要应用的函数返回的结果是 GenTraversableOnce 即可(列表的父类),例如:

scala> List(1,2,3,4,5)
res0: List[Int] = List(1, 2, 3, 4, 5)

scala> res0.flatMap(x => 1 to x )
res1: List[Int] = List(1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5)
 

写在后面:如需转载,请注明出处。