Java 1.8 Lambda 表达式
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 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!");