Java 1.8 Lambda 表达式

更新时间 2023-07-25 17:32:39

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡 / 赠书活动

目前, 星球 内第一个项目:全栈前后端分离博客项目,演示地址:http://116.62.199.48/, 1.0 版本已经更新完毕,正在更新 2.0 版本。采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 224 小节,累计 35w+ 字,讲解图:1544 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 1000+ 小伙伴加入,欢迎点击围观

一、Lambda表达式是什么?

在我们开始之前,先让我解释一下 Lambda 表达式是什么。Lambda 表达式其实就是一种更简洁的匿名函数,使你的代码更加整洁,看起来也更加优雅。

举个简单的例子,在 Java 8 之前,如果我们想创建一个新线程来打印一条消息,我们可能会这么写:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello from a thread!");
    }
}).start();

这看起来有点啰嗦,不是吗?而现在,有了 Lambda 表达式,我们可以用一种更简洁的方式来达到同样的效果:

new Thread(() -> System.out.println("Hello from a thread!")).start();

二、Lambda表达式的基础语法

那么 Lambda 表达式的语法是怎样的呢?基本的格式是这样的:

(argument1, argument2 ...) -> { body }

这里的 argument1, argument2 ... 是参数列表,body 是 Lambda 表达式需要执行的代码块。

例如,假设我们有一个字符串列表,我们想按字符串长度排序。使用 Lambda 表达式,我们可以这么做:

List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry", "Date");

Collections.sort(fruits, (String s1, String s2) -> {
    return s1.length() - s2.length();
});

在这个例子中,(String s1, String s2) 是参数列表,return s1.length() - s2.length(); 是 Lambda 表达式的主体。

三、类型推断和简化

你可能注意到了,在我们的 Lambda 表达式中,我们显式地写出了参数的类型(String s1, String s2)。然而,大多数情况下,Java 编译器可以自动推断出这些类型,所以我们可以省略它们,让代码更简洁:

Collections.sort(fruits, (s1, s2) -> s1.length() - s2.length());

四、Lambda 表达式与函数式接口

Lambda 表达式最强大的地方就是和函数式接口的配合。函数式接口是只有一个抽象方法的接口,像 Runnable、Comparator 这些都是函数式接口。Lambda 表达式可以被看作是这些接口的一个实例。

五、方法引用

有时候,我们的 Lambda 表达式只是简单地调用了一个已有的方法。例如,我们可以用 System.out::println 替代 s -> System.out.println(s)。这种写法称为方法引用:

Consumer<String> printer = System.out::println;
printer.accept("Hello, Lambda!");