集合式的函数API

2018-07-20  本文已影响0人  Ryan_Hoo

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 ]

上一篇 下一篇

猜你喜欢

热点阅读