1.成员引用
val getAge = Person::age
这个表达式成为member reference
,它提供了简短的语法创建一个调用方法或者访问属性的函数。
val getAge = { person: Person -> person.age }
一个成员引用是和lambda一样的函数调用类型。
我们也可以直接引用顶级函数(不是类成员):
fun salute() = println("Salute!")
>>> run(::salute)
Salute!
2.集合类型的函数api
filter 和map
filter移出不想要的集合中的元素,但是不改变元素。
使用给定的函数应用到集合的每个元素
集合断言:all,any,count,find
list分组成map:groupBy
>>> val people = listOf(Person("Alice", 31),
... Person("Bob", 29), Person("Carol", 31))
>>> println(people.groupBy { it.age })
>>> val list = listOf("a", "ab", "b")
>>> println(list.groupBy(String::first))
{a=[a, ab], b=[b]}
嵌套集合中处理元素:flatMap,flatten
flatMap函数做两件事情:首先根据函数的参数转换每个元素到集合中(map过程),然后将几个列表组合成一个(flattens过程)。
>>> val strings = listOf("abc", "def")
>>> println(strings.flatMap { it.toList() })
[a, b, c, d, e, f]
flatten直接合并数组
>>> val listOfLists = listOf(listOf("a", "b"), listOf("b","c"))
>>> println(listOfLists.flatten())
[a, b, b, c]
3 使用Java函数接口
给java方法传递lambda作为参数
/* Java */
void postponeComputation(int delay, Runnable computation);
在kotlin中,如果我们传递一个lambda作为参数,编译器自动将其转化成Runnable实例
postponeComputation(1000) { println(42) }
注意:我们说一个Runnable实例,其实是一个实现Runnable的匿名类实例对象。编译会为我们创建,使用lambda作为它单个抽象方法run的函数体。
当然我们也可以使用匿名对象来明确的实现Runnable接口
postponeComputation(1000, object : Runnable {
override fun run() {
println(42)
}
})
和lambda不同。当我们明确声明一个对象,每次调用将创建一个新的实例。而lambda在程序运行过程中只创建一个对象实例。
lambdas的接收对象:with 和 apply
fun alphabe(): String {
return StringBuilder().apply {
for (letter in 'A' .. 'Z') {
append(letter)
}
}.toString()
return StringBuilder().let {
for (letter in 'A' .. 'Z') {
it.append(letter)
}
it.toString()
}
return with(StringBuilder()) {
for (letter in 'A' .. 'Z') {
append(letter)
}
toString()
}
}
上面展示了三种不同的实例.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。