做Android开发的都知道,Android代码毋庸置疑是代码比较大,甚至有的地方表达是冗余的。那么Lambda前来报道,给你的代码量减减负,让你的代码看起来更加简洁,给你蓬乱的长发理个板寸。
什么是Lambda表达式?
A lambda expression is a block of code with parameters(Lambda表达式是一个带有参数的表达式)。
Lambda表达式我们叫做函数式接口(functional interface),它有且仅有一个抽象方法的接口(即一个待实现的方法),也可以理解为替换匿名内部类的一种写法。
先看看简单使用效果
giphy.gif引入方式
-
打开 File->Preferences,搜索closure 把它钩上
image.png -
打开Project Structure,选择使用java8
image.png -
gradle添加配置,Android 终于有了自己的 Java 编译器。Android7.0(API24)在对JAVA8的支持上,需要使用新的编译器。
image.png
另:Github上已经有开发者设计了兼容lambda表达式到Java7,6,5的开源库retrolamda。
Lambda表达式解析
btnClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG","lambda");
}
});
真正有用的代码只有toast这一行,却要占用6行代码来实现,不得不说确实代码冗余了。使用lambda表达式表示:btnClick.setOnClickListener(v -> Log.d("TAG","lambda");
lambda表达式通用格式:(args)->{body},则lambda表达式由三部分组成:
- (arg1,arg2...) 参数部分
- -> goes to符号
- {} 方法代码块
lambda表达式特征:
- 参数可以零个或多个
- 参数类型可指定或省略(Java编译器根据表达式的上下文推导出参数的类型)
- 表达式主体只有一条语句时,花括号可省略
使用场景:
-
无参数
()->body
new Thread(new Runnable() {
@Override
public void run() {
Log.d("TAG","lambda");
}
}).start();
使用lambda后,因为{}内只有一条语句,则省略{}花括号
new Thread(() -> Log.d("TAG","lambda")).start();
-
一个参数
(x)->body
btnClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG","lambda");
}
});
使用lambda后
btnClick.setOnClickListener(v -> Log.d("TAG","lambda"));
-
多个参数
//定义比较器进行排序
List<String> names = Arrays.asList("lilei", "hanmeimei", "tom", "jack");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
使用lambda后,自动缺省参数类型和花括号
List<String> names = Arrays.asList("lilei", "hanmeimei", "tom", "jack");
Collections.sort(names, (a, b) -> b.compareTo(a));
今天的节目到这里就暂时结束了。关于Lambda的使用结合Rxjava功能更加强大,能让开发者保持简洁的写法和清晰的逻辑,释放更多精力到完成业务当中去。
网友评论