Lambda表达式的使用实例(转载)

时间:2021-04-05 19:11:42

1、首先介绍下什么是Lambda?

我们知道,对于一个Java变量,我们可以赋给其一个“值”。
如果你想把“一块代码”赋给一个Java变量,应该怎么做呢?
比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的Java变量:
Lambda表达式的使用实例(转载)

在Java 8之前,这个是做不到的。但是Java 8问世之后,利用Lambda特性,就可以做到了。 为了使这个赋值操作更加elegant, 我们可以移除一些没用的声明。 如下图:
Lambda表达式的使用实例(转载)

这样,我们就成功的非常优雅的把“一块代码”赋给了一个变量。而“这块代码”,或者说“这个被赋给一个变量的函数”,就是一个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表达式的几个最重要的特征:

  1. 可选的类型声明:你不用去声明参数的类型。编译器可以从参数的值来推断它是什么类型。
  2. 可选的参数周围的括号:你可以不用在括号内声明单个参数。但是对于很多参数的情况,括号是必需的。
  3. 可选的大括号:如果表达式体里面只有一个语句,那么你不必用大括号括起来。
  4. 可选的返回关键字:如果表达式体只有单个表达式用于值的返回,那么编译器会自动完成这一步。若要指示表达式来返回某个值,则需要使用大括号。
    函数式接口的重要属性是:我们能够使用 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