FlatMap函数有一般的功能和map函数函数一样,就是经过map函数之后多了一个扁平化的过程。不过有个要求,传入的函数在处理完后返回值必须是List(或Seq),如果结果不是List(Seq),那么将出错。也就是说,传入的函数是有要求的 —— 返回值是Seq才行。这样,每个元素处理后返回一个List,我们得到一个包含List元素的List,flatMap自动将所有的内部list的元素取出来构成一个List返回。
/**
* 定义一个人对象
* @param name 人名
* @param friends 朋友们
*/
class people(val name: String, val friends: Seq[String])
def main(args: Array[String]) {
// 创建2个人
val p1 = new people("小红", Seq("朋友1", "朋友2", "朋友3"));
val p2 = new people("小明", Seq("朋友3", "朋友4", "朋友5"));
// 加入到序列中
val seqs = Seq[people](p1, p2)
做对比:map的方式:
val c = seqs.map(
f => f.friends
)
println(c)
flatmap的方式:
/** 然而有些时候, 你并不希望得到这么一个需要访问两层才能拿到朋友对象的序列.
* 有时, 你希望得到的是一个在第一层就能访问到朋友的序列. 这就需要 flatMap:
*/
// flatMap
val d = seqs.flatMap(
f => f.friends
)
println("flatMap的形式")
println(d)
}
}
输出结果
map的形式
List(List(朋友1, 朋友2, 朋友3), List(朋友3, 朋友4, 朋友5))
flatMap的形式
List(朋友1, 朋友2, 朋友3, 朋友3, 朋友4, 朋友5)
说的明白一点就是map处理完之后会有小List
flatmap处理完之后,把这些小list拍平了,小list里面所有的元素组成了一个list