Scala flatMap和map
flatMap
函数的一半功能和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)
println("map的形式")
val c = seqs.map(
f => f.friends
)
println(c)
/** 然而有些时候, 你并不希望得到这么一个需要访问两层才能拿到朋友对象的序列.
* 有时, 你希望得到的是一个在第一层就能访问到朋友的序列. 这就需要 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)