Lambda 表达式是 Java 8 引入的一种简洁的表示匿名方法的方式,使用它可以用于替代某些匿名内部类对象,从而让程序更简洁,可读性更好。但 Lambda 表达式的底层是如何实现的呢?接下来我们一起来看。
未使用 Lambda 表达式之前,我们创建一个线程,可以这样写:
Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("t1"); }});t1.start();
其中 Runnable 匿名内部类,查看 Runnable 源码,我们可以看到 Runnable 的实现如下:
匿名内部类是在 Java 中定义的一个没有名称的内部类。它通常在一个类的成员位置或者方法体内直接定义,并且立即实例化。
匿名内部类的主要用途在于简化代码,避免为了实现一个简单的功能而定义一个完整的类。它特别适用于只需要一次使用的类,比如实现一个接口的单方法(即函数式接口)的场合。
PS:自从 Java 8 引入 Lambda 表达式后,很多原本使用匿名内部类的地方可以被更简洁的 Lambda 表达式替代。
上面代码中的 new Runnable 就是一个标准匿名内部类的使用。
@FunctionalInterface 是 Java 8 引入的一个注解,它用于标记一个接口为函数式接口。
函数式接口是指只包含一个抽象方法的接口。这个注解虽然不是必需的,但它提供了一种明确的方式告诉编译器和开发者,这个接口是设计为函数式接口的。
@FunctionalInterface 注解的作用如下:
在 Java 标准库中,有许多使用 @FunctionalInterface 注解的接口,如 java.util.function 包下的 Function、Predicate、Consumer 等,这些接口都是函数式接口,广泛用于数据处理、过滤、转换等操作。此外,在 Spring Boot 框架中,也经常使用函数式接口来定义事件监听器、回调函数等。
未使用 Lambda 表达式之前,我们创建一个线程是这样写的:
Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println("t1"); }});t1.start();
而用了 Lambda 表达式,我们可以这样写:
Thread t1 = new Thread(() -> { System.out.println("t1"); });t1.start();
从上述代码可以看出,当我们使用 Lambda 表达式之后,代码就变得更简洁和优雅了。
Lambda 表达式的语法形式如下:
(parameters) -> expression
或者是:
(parameters) -> { statements; }
以上语法含义如下:
Lambda 表达式主要用于执行函数式接口(Function Interface),即只有一个抽象方法的接口。常见的函数式接口包括 java.util.function 包下的 Predicate、Function、Consumer 等。
假设我们有一个List,并且我们想要对这个列表进行过滤操作,只保留偶数元素。使用 Lambda 表达式可以非常方便地实现这一功能:
import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class Main { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); // 使用 Lambda 表达式过滤出偶数 List<Integer> evenNumbers = numbers.stream() .filter(n -> n % 2 == 0) .collect(Collectors.toList()); System.out.println(evenNumbers); // 输出 [2, 4, 6, 8] }}
在这个例子中,n -> n % 2 == 0 是一个 Lambda 表达式,它接受一个整数 n 作为输入参数,并返回一个布尔值。这个 Lambda 表达式被用作 filter 方法的参数,该方法期望一个 Predicate类型的函数式接口实例。
Lambda 底层运行原理如下:
所以,综合来说,Lambda 表达式其实是匿名内部类的语法糖,这个语法糖在程序执行时会进行兑现,也就是生成匿名内部类并进行任务执行。
本文链接:http://www.28at.com/showinfo-26-112795-0.html面试官:说说Lambda表达式底层原理?
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: 微服务为什么要容器化?