1

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

上面展示了三种不同的实例.


Star_
34 声望2 粉丝

Strive to be happy!


« 上一篇
布局方法一