Kotlin lambdas

1.成员引用

val getAge = Person::age

这个表达式成为member reference,它提供了简短的语法建立一个调用方法或者访问属性的函数。java

val getAge = { person: Person -> person.age }

一个成员引用是和lambda同样的函数调用类型。api

咱们也能够直接引用顶级函数(不是类成员):数组

fun salute() = println("Salute!")
>>> run(::salute)
Salute!

2.集合类型的函数api

filter 和map

  • filter移出不想要的集合中的元素,可是不改变元素。app

  • 使用给定的函数应用到集合的每一个元素ide

集合断言: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直接合并数组post

>>> 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实例ui

postponeComputation(1000) { println(42) }

注意:咱们说一个Runnable实例,实际上是一个实现Runnable的匿名类实例对象。编译会为咱们建立,使用lambda做为它单个抽象方法run的函数体。code

固然咱们也能够使用匿名对象来明确的实现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()
    }
}

上面展现了三种不一样的实例.

相关文章
相关标签/搜索