Kotlin-编程核心基石—高阶函数,android实战mysql

本文深入探讨了Kotlin如何通过高阶函数和Lambda表达式简化Android中的事件监听代码,包括SAM转换和Lambda的8种写法。通过实例展示了如何用函数类型和Lambda表达式减少接口定义,提高代码可读性。同时,文章介绍了带接收者的函数类型,解释了其在简化`apply`方法中的作用,并探讨了HTML Kotlin DSL的实现。
摘要由CSDN通过智能技术生成

public interface OnContextClickListener {
boolean onContextClick(View v);
}

Android 中设置点击事件和鼠标点击事件,分别是这样写的:

// 设置手指点击事件
image.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
gotoPreview();
}
});

// 设置鼠标点击事件
image.setOnContextClickListener(new View.OnContextClickListener() {
@Override
public void onContextClick(View v) {
gotoPreview();
}
});

请问各位小伙伴有没有觉得这样的代码很啰嗦?

现在我们假装自己是语言设计者,让我们先看看上面的代码存在哪些问题:

  • 定义方:每增加一个方法,就要新增一个接口:OnClickListenerOnContextClickListener
  • 调用方:需要写一堆的匿名内部类,啰嗦,繁琐,毫无重点

![](https://upload-imag
es.jianshu.io/upload_images/22976303-210dea9ecd906eb0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

仔细看上面的代码,开发者关心的其实只有一行代码:

gotoPreview();

如果将其中的核心逻辑抽出来,这样子才是最简明的:

image.setOnClickListener { gotoPreview() }
image.setOnContextClickListener { gotoPreview() }

Kotlin 语言的设计者是怎么做的?是这样:

  • 用函数类型替代接口定义
  • 用 Lambda 表达式作为函数参数

与上面 View.java 的等价 Kotlin 代码如下:

//View.kt
var mOnClickListener: ((View) -> Unit)? = null
var mOnContextClickListener: ((View) -> Unit)? = null

fun setOnClickListener(l: (View) -> Unit) {
mOnClickListener = l;
}

fun setOnContextClickListener(l: (View) -> Unit) {
mOnContextClickListener = l;
}

以上做法有以下的好处:

  • 定义方:减少了两个接口类的定义
  • 调用方:代码更加简明

细心的小伙伴可能已经发现了一个问题:Android 并没有提供 View.java 的 Kotlin 实现,为什么我们 Demo 里面可以用 Lambda 来简化事件监听?

// 在实际开发中,我们经常使用这种简化方式
setOnClickListener { gotoPreview() }

原因是这样的:由于 OnClickListener 符合 SAM 转换的要求,因此编译器自动帮我们做了一层转换,让我们可以用 Lambda 表达式来简化我们的函数调用。

那么,SAM 又是个什么鬼?

2-2 SAM 转换(Single Abstract Method Conversions)

SAM(Single Abstract Method),顾名思义,就是:只有一个抽象方法的类或者接口,但在 Kotlin 和 Java8 里,SAM 代表着:只有一个抽象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值