Java 中的 Lambda 表达式和 JDK 21 新特性详解

server/2024/11/30 15:08:06/

Java 中的 Lambda 表达式和 JDK 21 新特性详解

前言

Java 8 引入了 Lambda 表达式,极大地简化了代码编写,提高了开发效率。随着 JDK 21 的发布,Java 继续扩展和优化了 Lambda 表达式的功能,使其更加灵活和强大。本文将详细介绍 Java 中 Lambda 表达式的基本语法、类型推断、方法引用,并结合 JDK 21 的新特性,帮助读者更好地理解和使用这些功能。

1. Lambda 表达式的基本语法

Lambda 表达式是一种简洁的匿名函数表示法,其基本语法如下:

java">(parameters) -> expression
(parameters) -> { statements; }
1.1 无参、无返回值
java">Runnable runnable = () -> System.out.println("Hello, Lambda!");
runnable.run();
1.2 有参、无返回值
java">Consumer<String> consumer = (String s) -> System.out.println(s);
consumer.accept("Hello, World!");
1.3 有参、有返回值
java">Function<Integer, Integer> function = (Integer x) -> x * 2;
int result = function.apply(5);
System.out.println(result); // 输出 10
2. 类型推断

Lambda 表达式中的参数类型可以由编译器自动推断,因此通常可以省略参数类型。

java">Comparator<String> comparator = (a, b) -> a.compareTo(b);
3. 方法引用

方法引用是一种更简洁的表示 Lambda 表达式的方式,适用于已经有现成方法可以重用的情况。

3.1 引用对象的方法
java">User user = new User("Alice");
Consumer<String> consumer = user::sayHello;
consumer.accept("Bob");
3.2 引用类的静态方法
java">Comparator<Integer> comparator = Integer::compare;
3.3 引用类的实例方法
java">List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.sort(String::compareToIgnoreCase);
3.4 构造器引用
java">Supplier<User> supplier = User::new;
User user = supplier.get();
4. JDK 21 的新特性

JDK 21 继续扩展和优化了 Lambda 表达式的功能,以下是一些值得关注的新特性。

4.1 类型安全的 Lambda 表达式

JDK 21 引入了类型安全的 Lambda 表达式支持,进一步简化了类型推断,使代码更加简洁。

java">List<String> list = Arrays.asList("apple", "banana", "orange");// 使用之前的 Lambda 表达式
list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println);// 使用 JDK 21 的类型安全 Lambda 表达式,这里编译器可以更好地推断类型
list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println);
4.2 默认方法的支持

在 JDK 8 中引入了接口中的默认方法,JDK 21 继续优化了这些功能,使得 Lambda 表达式可以更灵活地与默认方法结合使用。

java">@FunctionalInterface
interface Task {void perform();default void log() {System.out.println("Task performed");}
}public class Main {public static void main(String[] args) {Task task = () -> System.out.println("Performing task...");task.perform();task.log();}
}
5. 注意事项
5.1 函数式接口

Lambda 表达式只能用于函数式接口,即接口中只有一个抽象方法的接口。可以使用 @FunctionalInterface 注解来确保接口符合要求。

java">@FunctionalInterface
interface MyFunction {int apply(int x, int y);
}
5.2 方法引用的限制

方法引用中的方法必须与 Lambda 表达式的目标类型相匹配。如果方法签名不匹配,编译器会报错。

6. 示例代码
6.1 使用 Lambda 表达式进行排序
java">import java.util.Arrays;
import java.util.List;
import java.util.Comparator;public class Main {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie");// 使用 Lambda 表达式进行排序names.sort((a, b) -> a.compareTo(b));// 使用方法引用进行排序names.sort(String::compareTo);// 打印排序后的列表names.forEach(System.out::println);}
}
6.2 使用 Lambda 表达式进行过滤和映射
java">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, 10);// 过滤偶数并平方List<Integer> squaredEvenNumbers = numbers.stream().filter(n -> n % 2 == 0).map(n -> n * n).collect(Collectors.toList());// 打印结果squaredEvenNumbers.forEach(System.out::println);}
}
结论

JDK 21 中的 Lambda 表达式继续优化和完善,提供了更多的灵活性和简洁性。通过结合类型推断、方法引用和默认方法,可以编写出更加优雅和高效的代码。希望本文的介绍和示例能够帮助读者更好地理解和使用 Java 中的 Lambda 表达式和 JDK 21 的新特性。


http://www.ppmy.cn/server/146178.html

相关文章

Python+Pytest+Yaml+Allure数据参数化(DDT)数据驱动(一)

我们在做数据之前要知道几个问题 1、在代码层面怎么来数据驱动 2、yaml文件是什么 3、怎么用yaml文件实现对应的数据驱动 我们用的是pytest框架所以相对来说是简单的&#xff0c;我们通过pytest框架来实现&#xff0c;而框架中要数据驱动用到我们装饰器就好啦pytest.mark.p…

开源项目:纯Python构建的中后台管理系统

来源&#xff1a;Python大数据分析 费弗里 大家好我是费老师&#xff0c;目前市面上有很多开源的「中后台管理系统」解决方案&#xff0c;复杂如「若依」那种前端基于Vue&#xff0c;后端基于Java的框架&#xff0c;虽然其提供了较为完善的一整套前后端分离权限管理系统解决方…

C++软件设计模式之组合模式与其他模式的协作举例

组合模式&#xff08;Composite Pattern&#xff09;、装饰器模式&#xff08;Decorator Pattern&#xff09;、享元模式&#xff08;Flyweight Pattern&#xff09;、迭代器模式&#xff08;Iterator Pattern&#xff09;和访问者模式&#xff08;Visitor Pattern&#xff09;…

Spark 内存管理机制

Spark 内存管理 堆内内存和堆外内存 作为一个 JVM 进程&#xff0c;Executor 的内存管理建立在 JVM(最小为六十四分之一&#xff0c;最大为四分之一)的内存管理之上&#xff0c;此外spark还引入了堆外内存&#xff08;不在JVM中的内存&#xff09;&#xff0c;在spark中是指不…

23种设计模式-工厂方法(Factory Method)设计模式

文章目录 一.什么是工厂方法设计模式&#xff1f;二. 工厂方法模式的特点三.工厂方法模式的结构四.工厂方法模式的优缺点五.工厂方法模式的 C 实现六.工厂方法模式的 Java 实现七.代码解析八.总结 类图&#xff1a; 工厂方法设计模式类图 一.什么是工厂方法设计模式&#xff1…

Matlab数字信号处理——音频信号处理与分析GUI

1.实现内容 实现功能有回响、变声、倒放、变速、音量调整、加噪、设计 FIR和 IR 滤波器实现去噪功能(高通低通带通带阻)&#xff0c;并且在时域波形图和频域波形展示变化。滤波器包括各种参数的选择、滤波器结构和类型的选择等。同时GUI上还包含打开、播放、保存、退出功能。 …

详细介绍HTTP与RPC:为什么有了HTTP,还需要RPC?

目录 一、HTTP 二、RPC 介绍 工作原理 核心功能 如何服务寻址 如何进行序列化和反序列化 如何网络传输 基于 TCP 协议的 RPC 调用 基于 HTTP 协议的 RPC 调用 实现方式 优点和缺点 使用场景 常见框架 示例 三、问题 问题一&#xff1a;是先有HTTP还是先有RPC&…

外卖点餐系统小程序

目录 开发前准备 项目展示项目分析项目初始化封装网络请求 任务1 商家首页 任务分析焦点图切换中间区域单击跳转到菜单列表底部商品展示 任务2 菜单列表 任务分析折扣信息区设计菜单列表布局请求数据实现菜单栏联动单品列表功能 任务3 购物车 任务分析设计底部购物车区域添加商…