集合式的函数API
1.1、基础:filter和map
filter函数遍历集合并选出应用给定lambda后会返回true的那些元素
val list= listOf(1,2,3,4)
println( list.filter{ it % 2 == 0 } )
结果:[ 2, 4 ]
上面的结果是一个新的集合。
filter函数可以从集合中移除你不想要的元素,但是他不会改变这些元素。而map可以对元素做变换
map函数对集合中的每个元素 应用给定的函数 并把结果收集到一个新的集合。
val list = listOf(1,2,3,4)
println( list.map { it * it } )
结果:[ 1, 4, 9, 16]
//如果你想打印的是一个姓名列表,而不是一个人的完整信息,可以使用map来变换列表
val people = listOf(Person("Alice",29) , Person("Bob",31))
println(people.map{it.name}) // 可替换为 people.map(Person :: name)
1.2、all、any、count 和 find:对应集合应用判断式
all 和 any 是检查集合中的所有元素是否符合某个条件 / 是否存在符合的元素。
count函数检查有多少个元素满足判断式。
find函数返回第一个符合条件的元素。
判断一个人是否没有到28
val canBeInClub27= { p:Person -> p.age <= 27 }
val people = listOf(Person("Alice",27),Person("Bob",31))
all判断是否所有元素是否都满足判断式
people.all(canBeInClub27)
any判断是否至少存在一个匹配的元素
people.any(canBeInClub27)
! all(“不是所有”)加上某个条件,可以用any加上这个条件的取反来替换。
! list.all{ it == 3 } => list.any{ it != 3 }
count 判断多少元素满足判断式
people.count(canBeInClub27)
count VS size
people.filter(canBeInClub27).size
在这种情况下,一个中间集合会被创建并用来存储所有满足判断式的元素。
count方法只是跟踪匹配元素的数量,不关心元素本身,所以高效。
find找到一个满足判断式的元素
people.find(canBeInClub27)
如果有多个匹配的元素就返回其中第一个元素 。 find还有个同义词 firstOrNull 。
1.3、groupBy:把列表转换成分组的map
people.groupBy{ it .age }
结果为{ 27 = [ Person("Alice",27) ], 31 = [ Person("Bob",31) ] }
这次操作的结果是一个map,是元素分组依据的键(age)和元素(Person)分组之间的映射。
1.4、flatMap 和 flatten:处理嵌套集合中的元素
flatMap先映射 ,然后平铺
val strings = listOf("abc","def")
println( strings.flatMap{ it.toList() } )
结果:[ a,b,c,d,e,f ]