filter函数遍历集合并选出应用给定的lambda后返回true的那些元素
例子:
val list = listOf(1,2,3,4,5,6,7,8,9)
// 只保留偶数
println(list.filter { it % 2 == 0 })
// 打印的到: [2, 4, 6, 8]
map函数对集合中的每一个元素应用给定的函数并把结果收集到一个新的集合。
例如把数字列表变成平法列表
val list = listOf(1,2,3,4)
println(data.map { it*it })
// 打印得到 [1, 4, 9, 16]
filter函数和map还可以链式连接起来。
val list = listOf(1,2,3,4,5,6,7,8,9)
println( list.filter { it%2 ==0 }.map { it*it })
还可以对map应用过滤和变换函数
val maps = mapOf(0 to "zero",1 to "one")
println( maps.filterKeys { it == 1 }.mapValues { it.value.toUpperCase() })
// {1=ONE}
键和值分别用不同函数处理。filterKeys和mapKeys过滤和变换map的键。 filterValues和mapValues过滤和变换map的值。
all -- 如果对所有元素都满足表达式,则使用all函数,返回Boolean值。
any -- 如果所有元素是否至少存在一个元素匹配,则使用any函数 ,返回Boolean值。
count -- 如果想知道多少个元素满足,则使用count ,返回Int值。
find -- 要找到一个满足条件的元素,使用find函数 ,返回符合条件元素。
如果你想把所有元素按照不同特征划分为不同组,你可以用到groupBy函数,返回一个map数据。
例如:
data class Room(val name :String,val floor:Int)
val data = listOf(Room("A01",1), Room("B01",2))
println(data.groupBy { it.floor })
// {1=[Room(name=A01, floor=1)], 2=[Room(name=B01, floor=2)]}
有的时候一个元素可能有多个特性,如果你想把所有元素的所有特性都统计出来,那么flatMap函数就很实用啦。
举个例子来说明:每本书都可能有一个或者多个作者,如果想统计出所有的作者。
data class Book(val name :String,val authors:List)
val books = listOf(Book("Mort", listOf("Jason","Tom")),Book("Good Omens", listOf("Neil")))
println(books.flatMap { it.authors }.toSet())
// [Jason, Tom, Neil]
很多语言都有这样语句,可以用它通过同一个对象执行多次操作,而不需要反复把对象名称写出来,Kotlin提供一个with的函数。
with函数把它的第一个参数转换成作为第二个参数传给他的lambd的接受者。 with允许你调用同一个对象的多个方法而不需要反复写出这个对象引用。
applay函数几乎和with函数一模一样的,唯一区别是apply始终会返回作为实参传递给它的对象。让你使用构建着风格的API创建和初始化任何对象。
// 第一种写法
with(receiver, {
//todo
})
// 第二种写法
with(reciver){
//todo
}
// 返回 对象本身
object.apply{
//todo
}
总结:lambda表达式的代码开起来简单,有时候却掩盖了底层操作的复杂性。所以始终要牢记自已写的代码在干什么。