kotlin学习之lambda(十)

目录


Kotlin跟Java的lambda编程其实区别不大,无论是用法和写法,都比较相似,这里不详细介绍lambda表达式的用法,主要介绍一下kotlin跟java的不同之处。

1. 如果lambda表达式是函数调用的最后一个实参,那么可以把lambda表达式放在括号外面。这是经常我们能看到有两个花括号的原因。。 2. 如果lambda表达式是唯一的参数,那么连括号都可以省略 3. 如果参数类型可以被推导出来,那么可以不需要写出类型。 ``` people.maxBy { p: Person -> p.age } //参数可以推断 people.maxBy { p -> p.age } //p看不出类型,没用可以去掉 people.maxBy { it.age } ```
  1. 我们可以把对象的函数用一个用引用代替,通过成员引用::
fun People.isAdult() = age >= 21
val predicate = People::isAdult

kotlin跟Java的集合API其实还是差不多。它的一些函数跟Google的Guava类库实现的东西差不多。

  1. filter()过滤集合,满足条件的留下来
  2. map()对集合中的每个元素进行映射
  3. all() 是否所有元素都满足
  4. any() 至少有一个满足
  5. count() 满足的个数,比(.size)方法性能出色
  6. find() 满足条件的第一个元素
  7. groupBy() 分组,返回键为分组条件,值为分组结果的一个map
  8. flatMap() 处理嵌套结果,比如一堆书,每本书都有一堆作者,可以统计出这些书的所有作者的一个set。
    方法是先对每个元素作出变换,然后把所有结果平铺。

kotlin处理集合链式处理有自己的一套方法。

  1. 链式处理可能会产生很多中间对象,如果想不要这些对象,要先调用asSequence()变成序列,然后再toList()还原。
  2. 序列的处理是并不是执行一个操作,等到处理完所有数据,再执行下一个操作,而是对每个数据直接执行完所有操作再对下一个数据进行处理。

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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值