val getAge = Person::age
這個表達式成爲member reference
,它提供了簡短的語法建立一個調用方法或者訪問屬性的函數。java
val getAge = { person: Person -> person.age }
一個成員引用是和lambda同樣的函數調用類型。api
咱們也能夠直接引用頂級函數(不是類成員):數組
fun salute() = println("Salute!") >>> run(::salute) Salute!
filter移出不想要的集合中的元素,可是不改變元素。app
使用給定的函數應用到集合的每一個元素ide
>>> 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函數作兩件事情:首先根據函數的參數轉換每一個元素到集合中(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]
/* 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在程序運行過程當中只建立一個對象實例。
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() } }
上面展現了三種不一樣的實例.