Java 1.8 Lambda 表达式
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 80w+ 字,讲解图 3365+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2700+ 小伙伴加入学习 ,欢迎点击围观
一、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!");