1、首先介绍下什么是Lambda?
我们知道,对于一个Java变量,我们可以赋给其一个“值”。
如果你想把“一块代码”赋给一个Java变量,应该怎么做呢?
比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的Java变量:
在Java 8之前,这个是做不到的。但是Java 8问世之后,利用Lambda特性,就可以做到了。 为了使这个赋值操作更加elegant, 我们可以移除一些没用的声明。 如下图:
这样,我们就成功的非常优雅的把“一块代码”赋给了一个变量。而“这块代码”,或者说“这个被赋给一个变量的函数”,就是一个Lambda表达式。
2、其次—————————-Android 项目中使用——————————————
如果想要在 Android 项目中使用 Lambda表达式 或者 Java8 的其他新特性,首先我们需要安装Java8版本的JDK,然后在 app/build.gradle 中添加以下配置:
android {
...
defaultConfig {
jackOptions.enabled = true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
之后就可以开始使用Lambda表达式了:
比如使用Lambda表达式开启子线程的写法是:
// 传统方式
new Thread(new Runnable() {
@Override
public void run() {
// 处理业务逻辑
}
}).start();
// 使用Lambda表达式
new Thread(() -> {
// 处理业务逻辑
}).start();
不管是从代码行数上还是缩进结构上看,Lambda表达式的写法更加精简。为什么可以这么写呢?我们看一下 Runnable 接口的源码:
public interface Runnable {
void run();
}
凡是这种只有一个待实现方法的接口,都可以使用 Lambda表达式的写法。
Android中点击事件使用Lambda表达式:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// 处理点击事件
}
});
使用Lambda表达式后:
button.setOnClickListener((v) -> {
// 处理点击事件
});
另外,当接口只有一个参数时,我们还可以进一步简化,将参数外面的括号去掉:
button.setOnClickListener(v -> {
// 处理点击事件
});
3、下面列举了Lambda表达式的几个最重要的特征:
- 可选的类型声明:你不用去声明参数的类型。编译器可以从参数的值来推断它是什么类型。
- 可选的参数周围的括号:你可以不用在括号内声明单个参数。但是对于很多参数的情况,括号是必需的。
- 可选的大括号:如果表达式体里面只有一个语句,那么你不必用大括号括起来。
- 可选的返回关键字:如果表达式体只有单个表达式用于值的返回,那么编译器会自动完成这一步。若要指示表达式来返回某个值,则需要使用大括号。
函数式接口的重要属性是:我们能够使用 Lambda 实例化它们,Lambda表达式让你能够将函数作为方法参数,或者将代码作为数据对待。Lambda 表达式的引入给开发者带来了不少优点:在 Java 8之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda表达式的应用则使代码变得更加紧凑,可读性增强;Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU的优势,更易于为多核处理器编写代码。引用自IBM - Java 8 新特性概述。
参考:https://blog.csdn.net/GoGleTech/article/details/79454151
https://www.jb51.net/article/112739.htm