目录
Kotlin跟Java的lambda编程其实区别不大,无论是用法和写法,都比较相似,这里不详细介绍lambda表达式的用法,主要介绍一下kotlin跟java的不同之处。
1. Lambda表达式介绍
1. 如果lambda表达式是函数调用的最后一个实参,那么可以把lambda表达式放在括号外面。这是经常我们能看到有两个花括号的原因。。 2. 如果lambda表达式是唯一的参数,那么连括号都可以省略 3. 如果参数类型可以被推导出来,那么可以不需要写出类型。 ``` people.maxBy { p: Person -> p.age } //参数可以推断 people.maxBy { p -> p.age } //p看不出类型,没用可以去掉 people.maxBy { it.age } ```- 我们可以把对象的函数用一个用引用代替,通过成员引用::
fun People.isAdult() = age >= 21
val predicate = People::isAdult
2. 集合API
kotlin跟Java的集合API其实还是差不多。它的一些函数跟Google的Guava类库实现的东西差不多。
- filter()过滤集合,满足条件的留下来
- map()对集合中的每个元素进行映射
- all() 是否所有元素都满足
- any() 至少有一个满足
- count() 满足的个数,比(.size)方法性能出色
- find() 满足条件的第一个元素
- groupBy() 分组,返回键为分组条件,值为分组结果的一个map
- flatMap() 处理嵌套结果,比如一堆书,每本书都有一堆作者,可以统计出这些书的所有作者的一个set。
方法是先对每个元素作出变换,然后把所有结果平铺。
3. 集合链式处理
kotlin处理集合链式处理有自己的一套方法。
- 链式处理可能会产生很多中间对象,如果想不要这些对象,要先调用asSequence()变成序列,然后再toList()还原。
- 序列的处理是并不是执行一个操作,等到处理完所有数据,再执行下一个操作,而是对每个数据直接执行完所有操作再对下一个数据进行处理。
4. with和apply
with解决的是对同一个对象调用很多函数这样的情况。例如:
fun alphabet(): String {
var stringBuilder = StringBuilder()
for (letter in 'A'..'Z') {
stringBuilder.append(letter)
}
stringBuilder.append("\n Now I know the alphabet!")
return stringBuilder.toString()
}
fun alphabetWith(): String {
var stringBuilder = StringBuilder()
return with(stringBuilder) {
for (letter in 'A'..'Z') {
this.append(letter) //this代表stringBuilder
}
this.append("\n Now I know the alphabet")
this.toString() //返回结果
}
}
with函数的参数是一个StringBuilder和一个lambda,但是由于lambda是最后一个参数,所以放在了括号外。
但是var stringBuilder = StringBuilder()这句话可以直接去掉,放在参数中,优化成
fun alphabetWith() = with(StringBuilder()) {
for (letter in 'A'..'Z') {
this.append(letter) //this代表stringBuilder
}
this.append("\n Now I know the alphabet")
toString()
}
}
apply跟with做的事情,区别是apply()始终返回调用它的对象,比如
fun alphaet() = StringBuilder().apply {
for (letter in 'A'..'Z') {
append(letter)
}
append("\nNow I know the Alphabet")
}.toString