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

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

前言

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

1. Lambda 表达式的基本语法

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

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

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

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

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

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

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

4.1 类型安全的 Lambda 表达式

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

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 表达式可以更灵活地与默认方法结合使用。

@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 注解来确保接口符合要求。

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

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

6. 示例代码
6.1 使用 Lambda 表达式进行排序
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 表达式进行过滤和映射
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.rhkb.cn/news/479247.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海康面阵、线阵、读码器及3D相机接线说明

为帮助用户快速了解和配置海康系列设备的接线方式&#xff0c;本文将针对海康面阵相机、线阵相机、读码器和3D相机的主要接口及接线方法进行全面整理和说明。 一、海康面阵相机接线说明 海康面阵相机使用6-pin P7接口&#xff0c;其功能设计包括电源输入、光耦隔离信号输入输出…

vue3(十七)-基础入门之vue-nuxt路由

一、路由 Nuxt.js 依据 pages 目录结构自动生成 vue-router 模块的路由配置。 要在页面之间使用路由&#xff0c;建议使用 < nuxt-link> 标签。 <template><nuxt-link to"/">首页</nuxt-link> </template>1、基础路由 pages 的目录结…

C++设计模式-中介者模式

动机(Motivation) 多个对象相互关联的情况&#xff0c;对象之间常常会维持一种复杂的引用关系&#xff0c;如果遇到一些需求的更改&#xff0c;这种直接的引用关系将面临不断的变化。在这种情况下&#xff0c;可以使用一种”中介对象“来管理对象间的关联关系&#xff0c;避免…

IntelliJ+SpringBoot项目实战(十四)--在SpringBoot中整合SpringSecurity和JWT(上)

SpringSecurity是大名鼎鼎的认证授权框架&#xff0c;在SSH时代就已经大放异彩。在JAVA项目中&#xff0c;权限框架的解决方案主要是以SpringSecurity和Shiro为主。JWT是目前主流的基于access-token的的认证框架&#xff0c;在项目中一般时SpringSecurity和JWT结合使用&#xf…

【AI系统】Tensor Core 架构演进

自 Volta 架构时代起&#xff0c;英伟达的 GPU 架构已经明显地转向深度学习领域的优化和创新。2017 年&#xff0c;Volta 架构横空出世&#xff0c;其中引入的张量核心&#xff08;Tensor Core&#xff09;设计可谓划时代之作&#xff0c;这一设计专门针对深度学习计算进行了优…

问题记录-Java后端

问题记录 目录 问题记录1.多数据源使用事务注意事项&#xff1f;2.mybatis执行MySQL的存储过程&#xff1f;3.springBoot加载不到nacos配置中心的配置问题4.服务器产生大量close_wait情况 1.多数据源使用事务注意事项&#xff1f; 问题&#xff1a;在springBoot项目中多表处理数…

java:aqs实现自定义锁

aqs采用模板方式设计模式&#xff0c;需要重写方法 package com.company.aqs;import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.AbstractQueuedSynchronizer; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock;…

day11_JS初识_语法

day11_JS初识_语法 今日学习目标 : 入门HarmonyOS生态中 , ArkTS最基础的语法 JavaScript , 今天最主要的学习内容了解和掌握JavaScript的基础语法 , 并灵活的再后面开发过程进行使用 今日学习目标 什么是JavaScript JavaScript组成 JavaScript执行环境 JavaScript代码的书…

[C++]:IO流

1. IO 流 1.1 流的概念 在C中&#xff0c;存在一种被称为“流”的概念&#xff0c;它描述的是信息流动的过程&#xff0c;具体来说就是信息从外部输入设备&#xff08;比如常见的键盘&#xff09;传输到计算机内部&#xff08;像内存区域&#xff09;&#xff0c;以及信息从内…

基于Kubernetes编排部署EFK日志收集系统

基于K8S编排部署EFK日志收集系统 案例分析 1. 规划节点 节点规划&#xff0c;见表1。 表1 节点规划 IP主机名k8s版本信息192.168.100.3masterv1.25.2192.168.100.4nodev1.25.2 2. 基础准备 Kubernete环境已安装完成&#xff0c;将提供的软件包efk-img.tar.gz上传至master…

Kubernetes 还是 SpringCloud?

前些年&#xff0c;随着微服务的概念提出以及落地&#xff0c;不断有很多的公司都加入到了这场技术革新中&#xff0c;现在可谓是人人都在做和说微服务。 提到微服务&#xff0c;Java栈内&#xff0c;就不得不提SpringBoot、SpringCloud、Dubbo。 近几年&#xff0c;随着Cloud …

ChatGPT如何辅助academic writing?

今天想和大家分享一篇来自《Nature》杂志的文章《Three ways ChatGPT helps me in my academic writing》&#xff0c;如果您的日常涉及到学术论文的写作&#xff08;writing&#xff09;、编辑&#xff08;editing&#xff09;或者审稿&#xff08; peer review&#xff09;&a…

101.【C语言】数据结构之二叉树的堆实现(顺序结构) 2

目录 1.堆删除函数HeapPop 一个常见的错误想法:挪动删除 正确方法 设计堆顶删除函数HeapPop 解析向下调整函数AdjustDown 核心思想 向下调整最多次数 向下调整的前提 代码实现 提问 细节分析 2.测试堆删除函数 运行结果 3.引申问题 运行结果 4.练习 分析 代码…

【机器学习chp8】统计学习理论

前言 本文遗留问题&#xff1a;无 目录 前言 一、结构风险最小化 1、最小化风险决策 2、分类与回归中的最小化风险决策 3、统计学习的基本目标 4、无免费午餐定理 5、Hoeffding不等式 &#xff08;1&#xff09;背景及定义 &#xff08;2&#xff09;Hoeffding不等式…

Springboot启动报错’javax.management.MBeanServer’ that could not be found.

报错信息如下图&#xff1a; 解决办法&#xff1a; 1.在你的.yml文件或者.properties文件里加上如下配置&#xff1a; properties: management.endpoints.jmx.enabledfalseyml: management:endpoints:jmx:enabled: false2.如果以上方法行不通&#xff0c;在springboot启动类…

英语知识网站:Spring Boot技术构建

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

英伟达推出了全新的小型语言模型家族——Hymba 1.5B

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

spring boot2.7集成OpenFeign 3.1.7

1.Feign Feign是一个声明式web服务客户端。它使编写web服务客户端更容易。要使用Feign&#xff0c;请创建一个接口并对其进行注释。它具有可插入注释支持&#xff0c;包括Feign注释和JAX-RS注释。Feign还支持可插拔编码器和解码器。Spring Cloud增加了对Spring MVC注释的支持&…

Jmeter中的前置处理器

5&#xff09;前置处理器 1--JSR223 PreProcessor 功能特点 自定义数据处理&#xff1a;使用脚本语言处理请求数据&#xff0c;实现高度定制化的数据处理和生成。动态数据生成&#xff1a;在请求发送前生成动态数据&#xff0c;如随机数、时间戳等。变量设置&#xff1a;设置…

git(Linux)

1.git 三板斧 基本准备工作&#xff1a; 把远端仓库拉拉取到本地了 .git --> 本地仓库 git在提交的时候&#xff0c;只会提交变化的部分 就可以在当前目录下新增代码了 test.c 并没有被仓库管理起来 怎么添加&#xff1f; 1.1 git add test.c 也不算完全添加到仓库里面&…