如何配置 lambda?
//在 app/build.gradle
android {
compileSdkVersion 26
defaultConfig { }
buildTypes { }
compileOptions {
targetCompatibility 1.8
sourceCompatibility 1.8
}
}
RxJava 配合 lambda,代码看起来会简洁很多,也更加容易看懂,当然前提是要会 lambda,所以本章介绍一下lambda 的基础用法,其实也很简单,看几个例子就可以了。
lambda的使用前提是某个内部类、匿名内部类只有一个方法,例如以下几个类:
interface InnerZeroParamReturnClass {
Object opr();
}
interface InnerZeroParamClass {
void opr();
}
interface InnerOneParamClass {
void opr(int a);
}
interface InnerTwoParamClass {
void opr(int a, int b);
}
我们再添加几个方法,参数分别为上述几个接口对象
public void opr0(InnerZeroParamClass opr) {}
public void opr01(InnerZeroParamReturnClass opr) {}
public void opr1(InnerOneParamClass opr) {}
public void opr2(InnerTwoParamClass opr) {}
lambda 例子介绍
下面通过举几个例子来介绍最基础的lambda 最基础的语法,例子间的顺序为逐渐深入,每个例子在前面的例子的基础上在介绍一个新的特点
- 基本语法
(v1, v2) -> {}
,我们以opr2
方法为例子
opr2((a, b) -> {
int sum = a + b;
System.out.println(sum);
});
- 如果参数只有一个,则可以省略箭头左侧的圆弧括号
opr1(a -> {
int square = a * a;
System.out.println(square);
});
- 如果没有参数,则需要一对圆弧括号
opr0(() -> {
String result = "no param";
System.out.println(result);
});
- 如果匿名内部类只有一条语句(不一定是一行,可以是链式),那么可以省略大括号
opr1(v ->
System.out.println("")
;
//这个例子还属于第2种语法情况
- 如果匿名内部类的方法体只有一个语句,且参数A是相同的,那么可以用双冒号写法,即去掉
(v1, v2) ->
以及方法的(param)
部分,方法调用.
改成方法引用::
,如下
opr1(A ->
System.out.println(A)
;,
//上面满足条件1.方法体只有一个语句;2该语句方法的参数和'->'左侧的参数是同一个变量
//所以可以变成简写成下面这种写法
opr1(System.out::println); //println 是 out 的静态方法,同样的如果是调用成员方法,格式为 obj::method
- 如果匿名内部类只有一个返回语句,可以省略 return 关键字
opr01(() -> "Done");
//这个例子还属于第3, 4种语法情况
以上的六个例子基本涵盖了lambda的所有语法规则,也就是说看懂上面几个例子后,阅读和使用 lambda 已经不成问题了。本章之所以没有其它篇幅那么长,是因为其它长篇幅文章介绍的比较详细,包括新的集合类型的 API 之类的,但是其实新的API使用到的也只是上面的这六种语法,比如 List 接口的 foreach,可以用来简写遍历集合的代码,如下:
List list = Arrays.asList(1, 2, 3, 4, 5);
//for 循环
for (int num : list) {
System.out.println(num);
}
//lambda
list.forEach(System.out::println);
看到上面的的写法,很让人激动人心,但点击去一看这个forEach
,无非就是接收了一个只有一个方法的接口对象,然后运用上面第5种 lambda 写法而已,没什么神奇的,所以这些新的相关 API的定义并不属于 lambda 语法范畴,也就是说 lambda 语法就是这么简单,大家完全看一会写一写就可以在项目中使用。
我目前不是做纯 Java 开发,所以用 AS 来支持像 List 的forEach
之类的新 API 会比较麻烦,需要 API 24以上,或者是集成第三方 lambda 支持框架。新API 大多数情况都可以用相关操作符替代,代码量也接近新 API,所以这里就不介绍了。
所以本章只介绍 lambda 语法,不深入其它关联的 API,如果大家对相关新增的 API 有兴趣,可以看这边文章哦