kotlin lambda与匿名内部类的使用

本文探讨了Kotlin中使用lambda表达式简化匿名内部类的实例,通过对比Java,还介绍了接口回调和自定义回调类的应用。重点在于展示两者在实现简洁性和代码可读性的提升。

常规的方式实现匿名内部类

valueAnimator.addUpdateListener(object :AnimatorUpdateListener {
    override fun onAnimationUpdate(animation: ValueAnimator?) {
        currentPoint = animation?.animatedValue as Point
        postInvalidate()
    }
})

使用lambda后

valueAnimator.addUpdateListener { animation ->
    currentPoint = animation?.animatedValue as Point
    postInvalidate()
}

内部定义接口并回调


interface ICallback {
    fun onSuccess(msg: String)

    fun onFail(msg: String)
}

class NormalCallback {

    var mCallback: ICallback? = null

    fun setCallback(callback: ICallback) {
        mCallback = callback
    }

    fun init() {
        mCallback?.onSuccess("success message")
    }
}

关于kotlin与java中lambda使用的对比

Kotlin 中,**Lambda 表达式** 和 **`object` 表达式(匿名内部类)** 都可以用来创建函数式对象或实现接口/抽象类,但它们的使用场景和语义有所不同。选择使用 `lambda` 还是 `object` 取决于具体的需求。 --- ### ✅ Lambda 表达式适用场景 LambdaKotlin 中函数式编程的核心特性,适用于: #### 1. **实现只有一个抽象方法的接口(SAM)** - 即函数式接口(Functional Interface),如 `Runnable`、`OnClickListener` 等。 - Lambda 表达式更简洁。 ```kotlin button.setOnClickListener { println("Button clicked") } ``` #### 2. **作为高阶函数参数传递** - 常用于集合操作、协程、回调等场景。 ```kotlin val list = listOf(1, 2, 3) list.forEach { println(it) } ``` #### 3. **不需要访问或修改外部状态或保存状态信息** - Lambda 不能保存状态(除非捕获变量),适合无状态操作。 --- ### ✅ `object` 表达式适用场景 `object` 表达式用于创建匿名内部类的实例,适用于: #### 1. **实现多个方法的接口或抽象类** ```kotlin val listener = object : View.OnTouchListener { override fun onTouch(v: View?, event: MotionEvent?): Boolean { // 实现多个方法 return true } } ``` #### 2. **需要保存状态(成员变量)** - `object` 可以有属性和多个方法,适合需要维护状态的场景。 ```kotlin val counter = object { var count = 0 fun increment() { count++ } } ``` #### 3. **需要继承类并重写方法** - 例如继承 `Thread`、`BaseAdapter` 等。 ```kotlin object : Thread() { override fun run() { println("Running in a new thread") } } ``` #### 4. **需要命名对象或多次使用** - `object` 可以赋值给变量,多次使用。 ```kotlin val logger = object : Logger { override fun log(message: String) { println("LOG: $message") } } logger.log("Hello") ``` --- ### 🧠 Lambda `object` 的区别总结 | 特性 | Lambda 表达式 | `object` 表达式 | |------|----------------|----------------| | 是否能实现多个方法 | ❌ 否(只能实现一个方法) | ✅ 是 | | 是否能保存状态 | ❌ 否(除非捕获变量) | ✅ 是 | | 是否简洁 | ✅ 是 | ❌ 否 | | 是否适合实现 SAM 接口 | ✅ 是 | ✅ 是 | | 是否能继承类 | ❌ 否 | ✅ 是 | | 是否可复用 | ❌ 否(通常一次性使用) | ✅ 是 | --- ### ✅ 示例对比 #### 使用 Lambda(适合单个方法): ```kotlin val runnable = Runnable { println("Runnable with lambda") } ``` #### 使用 `object`(适合多个方法或继承类): ```kotlin val runnable = object : Runnable { override fun run() { println("Runnable with object expression") } } ``` --- ### ✅ 总结:什么时候用 Lambda?什么时候用 `object`? | 需求 | 推荐方式 | |------|----------| | 实现只有一个方法的接口(SAM) | Lambda | | 需要多个方法或继承类 | `object` | | 需要保存状态 | `object` | | 需要复用对象 | `object` | | 简洁的回调或高阶函数 | Lambda | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值