flatMap
假设有个序列, 里面装了一堆人
1 | val xs = Seq(john, mary, alice, bob) |
每个人有一个朋友列表, 可以这么访问:
1 | x.friends // 返回一个序列, 里面每个元素是一个人 |
比如 john.friends 可能返回 Seq(harry, hermione, ron)
用 map 的话, 可以把 xs 里的每一个元素都变成朋友列表:
1 | xs.map(x => x.friends) |
然而有些时候, 你并不希望得到这么一个需要访问两层才能拿到朋友对象的序列. 有时, 你希望得到的是一个在第一层就能访问到朋友的序列. 这就需要 flatMap:
1 | xs.flatMap(x => x.friends) |
这个过程就像是先 map, 然后再将 map 出来的这些列表首尾相接 (flatten).