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()
    }
}

上面展現了三種不一樣的實例.

相關文章
相關標籤/搜索