个人理解

  1. 调用flatMap方法的是一个可迭代集合(注意:字符串是一个可迭代集合,字符串中的元素为字符)
  2. 什么类型调用的flatMap方法,则返回的也是什么类型
  3. flatMap = map + flatten 即先对集合中的每个元素进行map,再对map后的每个元素(map后的每个元素必须还是集合)中的每个元素进行flatten
  4. 进行map的对象可以是只含一层的集合,但进行flatten操作的对象必需是至少含两层的集合

实例讲解

实例一:

var str = "string"
str.foreach(c => printf("%c ", c)) #输出结果:s t r i n g

以上结果表明:字符串是可迭代的集合 

实例二:

var words = Set("hive", "hbase", "redis")
val result = words.flatMap(x => x.toUpperCase)
println(result) // 输出结果:Set(E, A, I, V, B, H, R, D, S)
  1. 调用flatMap方法的是一个Set集合,明显可迭代
  2. 调用flatMap方法的是一个Set集合,则最终返回的也应该是一个Set集合
  3. 先对words中的每个元素调用toUpperCase方法(该方法是字符串的方法,字符的对应转换为大写方法为toUpper),map的结果应该变为Set["HIVE", "HBASE", "REDIS"],接下来进行flatten;对于map后的每个元素中的每个元素进行flatten,"HBASE"中的每个元素依次为: 'H' 'B' 'A' 'S' 'E' 因为最终是返回一个set,也就是将这些元素全部放入set中。所以最后的结果显而易见了。
  4. words对象为一个含两层的集合(第一次遍历可以得到每个字符串,第二层遍历可以得到每个字符串所对应的字符),即使将words对象每个元素进行转换大写后,仍然为一个两层集合,所以可以进行flatMap操作

实例三:

java用spark的flatmap拉平 spark中flatmap的用法_迭代

如果是上面这个例子,由于words中每个元素为字符,已经无法再分离了,因此此时的words为一层集合,无法进行flatMap操作,所以编译会报错

实例四:

var words = Set(List('s', 'c', 'd'), List('d', 'c'))
println(words.flatMap(x => x.tail)) // 输出结果:Set(c, d)

而对于上面这个例子,却是可以正确输出的。原因:words中的每个元素为一个List,而List是可迭代的,所以words至少是一个含两层的集合,因此words对象是可以进行flatMap操作的。