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() } }
上面展现了三种不一样的实例.