当前位置: 首页 > news >正文

Java 8 新特性:深入理解 Lambda 表达式的强大与应用

Java 8 新特性:深入理解 Lambda 表达式的强大与应用

Lambda 表达式是 Java 8 引入的重要特性之一,它允许将匿名函数(即无名称的函数)作为参数传递给方法,简化了代码的编写,使代码更加简洁和易读。本文将深入探讨 Lambda 表达式的原理、语法、使用场景及其在实际编程中的应用。

1. Lambda 表达式的基本语法

Lambda 表达式的基本语法形式如下:

(parameters) -> expression
或者
(parameters) -> { statements; }

示例

// 无参数,返回固定值
() -> 42// 单个参数,返回其平方
x -> x * x// 多个参数,返回它们的和
(x, y) -> x + y// 带有块语句
(x, y) -> {int sum = x + y;return sum;
}

2. 基本使用示例

示例:简单的 Lambda 表达式

import java.util.function.Consumer;public class LambdaBasicExample {public static void main(String[] args) {// 使用 Lambda 表达式打印消息Consumer<String> printMessage = message -> System.out.println(message);printMessage.accept("Hello, Lambda!");}
}

3. 集合操作

示例:列表排序

import java.util.Arrays;
import java.util.List;public class LambdaSortExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 使用 Lambda 表达式排序列表names.sort((a, b) -> a.compareTo(b));System.out.println(names); // 输出:[Anna, Mike, Peter, Xenia]}
}

示例:过滤和映射

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;public class LambdaFilterMapExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 使用 Lambda 表达式过滤并映射List<String> result = names.stream().filter(name -> name.startsWith("P")).map(String::toUpperCase).collect(Collectors.toList());System.out.println(result); // 输出:[PETER]}
}

4. 使用自定义函数式接口

Lambda 表达式通常与函数式接口一起使用。函数式接口是只有一个抽象方法的接口,可以用 @FunctionalInterface 注解来标识。
示例

@FunctionalInterface
interface Converter<F, T> {T convert(F from);
}public class LambdaCustomInterfaceExample {public static void main(String[] args) {Converter<String, Integer> converter = (from) -> Integer.valueOf(from);Integer converted = converter.convert("123");System.out.println(converted); // 输出:123}
}

5. 并发编程

示例:创建线程

public class LambdaThreadExample {public static void main(String[] args) {// 使用 Lambda 表达式创建线程new Thread(() -> {for (int i = 0; i < 5; i++) {System.out.println("Hello from thread " + Thread.currentThread().getName());}}).start();}
}

示例:使用 CompletableFuture

import java.util.concurrent.CompletableFuture;public class LambdaCompletableFutureExample {public static void main(String[] args) {CompletableFuture.supplyAsync(() -> "Hello").thenApply(result -> result + " World").thenAccept(result -> System.out.println(result)); // 输出:Hello World}
}

6. 高阶函数

示例:接受 Lambda 表达式作为参数

import java.util.function.Function;public class HigherOrderFunctionExample {public static void main(String[] args) {Function<Integer, Integer> square = x -> x * x;System.out.println(applyFunction(5, square)); // 输出:25}public static <T, R> R applyFunction(T input, Function<T, R> function) {return function.apply(input);}
}

示例:返回 Lambda 表达式

import java.util.function.Function;public class HigherOrderFunctionExample {public static void main(String[] args) {Function<Integer, Integer> adder = createAdder(10);System.out.println(adder.apply(5)); // 输出:15}public static Function<Integer, Integer> createAdder(int addend) {return x -> x + addend;}
}

7. 捕获局部变量

示例

public class LambdaVariableCaptureExample {public static void main(String[] args) {final int num = 1;Converter<Integer, String> stringConverter = (from) -> String.valueOf(from + num);System.out.println(stringConverter.convert(2)); // 输出:3}public interface Converter<F, T> {T convert(F from);}
}

8. 方法引用

示例:静态方法引用

import java.util.Arrays;
import java.util.List;public class StaticMethodReferenceExample {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(3, 2, 1);// 使用静态方法引用排序列表numbers.sort(Integer::compare);System.out.println(numbers); // 输出:[1, 2, 3]}
}

示例:实例方法引用

import java.util.Arrays;
import java.util.List;public class InstanceMethodReferenceExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 使用实例方法引用names.forEach(System.out::println);}
}

9. 构造函数引用

示例

import java.util.function.Function;class Person {private String name;public Person(String name) {this.name = name;}public String getName() {return name;}
}public class ConstructorReferenceExample {public static void main(String[] args) {// 使用构造函数引用Function<String, Person> personFactory = Person::new;Person person = personFactory.apply("John");System.out.println(person.getName()); // 输出:John}
}

10. 使用 Optional

示例:避免空指针异常

import java.util.Optional;public class LambdaOptionalExample {public static void main(String[] args) {Optional<String> optional = Optional.of("Hello");// 使用 Lambda 表达式处理 Optionaloptional.ifPresent(System.out::println); // 输出:Hello}
}

11. 自定义排序逻辑

示例

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;public class LambdaCustomSortExample {public static void main(String[] args) {List<String> names = Arrays.asList("Peter", "Anna", "Mike", "Xenia");// 自定义排序逻辑names.sort((a, b) -> {int lengthCompare = Integer.compare(a.length(), b.length());if (lengthCompare != 0) {return lengthCompare;}return a.compareTo(b);});System.out.println(names); // 输出:[Anna, Mike, Peter, Xenia]}
}

12. 复杂场景中的 Lambda 表达式

Lambda 表达式不仅可以用于简单的集合操作,还可以用于更复杂的场景,如事件处理、GUI 编程等。
示例:事件处理

import javax.swing.*;
import java.awt.event.ActionEvent;public class LambdaEventHandlerExample {public static void main(String[] args) {JFrame frame = new JFrame("Lambda Example");JButton button = new JButton("Click Me");// 使用 Lambda 表达式添加事件监听器button.addActionListener(event -> System.out.println("Button clicked"));frame.add(button);frame.setSize(200, 200);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);}
}

总结

Lambda 表达式不仅简化了代码,还使 Java 具备了函数式编程的能力。通过上述示例,可以更好地理解 Java 8 的 Lambda 表达式及其应用场景。Lambda 表达式不仅简化了代码,还使 Java 具备了函数式编程的能力。掌握 Lambda 表达式及其相关的新特性,可以显著提高代码的简洁性和可维护性,并且在集合操作、并发编程、事件处理等场景中发挥重要作用。

相关文章:

Java 8 新特性:深入理解 Lambda 表达式的强大与应用

Java 8 新特性&#xff1a;深入理解 Lambda 表达式的强大与应用 Lambda 表达式是 Java 8 引入的重要特性之一&#xff0c;它允许将匿名函数&#xff08;即无名称的函数&#xff09;作为参数传递给方法&#xff0c;简化了代码的编写&#xff0c;使代码更加简洁和易读。本文将深…...

HTML5 Canvas图形绘制技术应用

HTML5 Canvas图形绘制技术应用 目录 Canvas基础知识基本绘图操作路径操作文本绘制图像绘制变换复合图形与剪切阴影渐变动画与交互高级技巧...

JMETER工具:以录制手机app为例

JMETER工具&#xff1a;以录制手机app为例子 JMETER安装和环境配置 pc需要安装jdk&#xff0c;并进行jdk的环境配置&#xff0c;安装好jdk并配置好后&#xff0c;通过命令行输入java –version出现以下界面就表示安装成功&#xff1a; &#xff08;对应的jdk版本不可太低&…...

PDF文件权限密码保护:如何去除及解决方法

如果你忘记了PDF文件密码&#xff0c;不用担心&#xff01;PDF解密、找回密码、去除密码的方法简单易行。只需两步&#xff1a;1、打开百度搜索“密码帝官网”&#xff1b;2、在官网页面点击“立即开始”&#xff0c;上传文件&#xff0c;稍等片刻即可找回密码。这种方法安全、…...

【电子信息(工程)】电子通信创新创业教育综合

电子通信创新创业教育 阐述电磁场、电磁波和电磁频谱及应用一、电磁场 法拉第根据电流与磁场的关系,提出了电磁感应定律:如果电磁场中有处于运动状态下的闭合回路导体存在,流经该导体磁场的磁场强度和磁场量,通常都会出现相应的变化,电磁感应电流由此而产生。随后,英国的…...

光伏无人机巡检的工作原理是什么?

随着科技的飞速发展&#xff0c;无人机技术已经深入到众多领域&#xff0c;其中光伏电站的巡检工作便是其应用的一个重要方向。光伏无人机巡检&#xff0c;通过搭载各种先进的传感器和设备&#xff0c;对光伏电站进行全面的、高效的、安全的检测&#xff0c;为电站的运维管理提…...

泛型中K T V E ? Object等分别代表的含义

E – Element (在集合中使用&#xff0c;因为集合中存放的是元素) T – Type&#xff08;Java 类&#xff09; K – Key&#xff08;键&#xff09; V – Value&#xff08;值&#xff09; N – Number&#xff08;数值类型&#xff09; &#xff1f; – 表示不确定的java类型&…...

常用损失函数学习

损失函数&#xff08;Loss Function&#xff09;&#xff0c;在机器学习和统计学中&#xff0c;是用来量化模型预测输出与真实结果之间差异的函数。简而言之&#xff0c;损失函数衡量了模型预测的好坏&#xff0c;目标是通过最小化这个函数来优化模型参数&#xff0c;从而提高预…...

判断视频moov的位置

前言 MP4文件由若干称为Atom&#xff08;或称为box&#xff09;的数据对象组成&#xff0c;每个Atom的起首为四个字节的数据长度&#xff08;Big Endian&#xff09;和四个字节的类型标识&#xff0c;数据长度和类型标志都可以扩展。Atom可以嵌套&#xff0c;即其数据域可以由…...

python安装依赖

创建 requirement.txt 文件并填充内容 flask2.0.0 pandas1.3.3 numpy1.21.2 安装模块 pip install -r requirement.txt...

如何利用GitHubAction来发布自己的Python软件包

我们开发的python软件包如果想发布到网上&#xff0c;可以让其他人通过pip install下载&#xff0c;一般是把软件包发布到PYPI平台。 PYPI准备 我们要现在pypi注册登录一下 文件组织架构 一般的python软件包的文件组织架构为包名文件夹__init__.py程序&#xff0c;包文件夹的…...

raspberry pi/orienge pi等arm架构硬件打包ros humble docker视觉及机器人开发镜像

raspberry pi/orienge pi等arm架构硬件打包ros humble docker开发镜像 文章目录 前言准备工作拉取镜像编写Dockerfile编译docker镜像启动镜像docker-compose文件编写总结前言 这篇文章主要用于定制化打包需要的docker镜像,由于ros1提供的镜像源是国外的很多软件无法更新,所以…...

springboot+mysql在线考试系统-计算机毕业设计源码82584

摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对在线考试等问题&#xff0c;对如何通过计算…...

LangChain - 建立代理

本文翻译整理自&#xff1a;Build an Agent https://python.langchain.com/v0.2/docs/tutorials/agents/ 文章目录 一、说明概念 二、定义工具1、TavilyAPI参考&#xff1a; 2、RetrieverAPI参考&#xff1a;API参考&#xff1a; 3、工具 三、使用语言模型四、创建代理五、运行…...

爬虫案例:有道翻译python逆向

pip install pip install requestspip install base64pip install pycrytodome tools 浏览器的开发者工具&#xff0c;重点使用断点&#xff0c;和调用堆栈 工具网站&#xff1a;https://curlconverter.com/ 简便请求发送信息 flow 根据网站信息&#xff0c;preview,respon…...

仅需一块 4GB 的 GPU ,就能运行开源大语言模型:Llama3 70B

最强的开源大语言模型 Llama3 已经发布一段时间了&#xff0c;一些盆友资源有限&#xff0c;私信询问是否可以使用 4GB 的 VRAM 在本地运行 Llama3 70B。 与 GPT-4 相比&#xff0c;Llama3 的性能如何&#xff1f;Llama3 使用了哪些关键的前沿技术使其变得如此强大&#xff1f…...

一战成电失败,二战上岸复旦!

这个系列会邀请往届学长学姐进行经验分享~ 本篇是复旦大学957来自专业课134分上岸同学的经验分享。 经验分享 大家好&#xff0c;大伙能点进这个帖子倍感荣幸。 先说一下个人情况吧&#xff0c;鼠鼠本科武汉大学物院&#xff0c;总共四年混了四年&#xff0c;绩点低&#x…...

27寸2K显示器 - HKC G27H2

HKC G27H2是一款面向电竞市场的高性能显示器&#xff0c;以其2K分辨率和180Hz的刷新率作为主要卖点&#xff0c;旨在为玩家提供流畅而清晰的视觉体验。配备HDR 400技术和95% DCI-P3色域覆盖&#xff0c;这款显示器还支持升降旋转支架&#xff0c;为用户提供了高度的人体工程学适…...

编程实战:类C语法的编译型脚本解释器(七)语句

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 系列入口&#xff1a; 编程实…...

实体-联系图

为了把用户的数据要求清楚、准确地描述出来,系统分析员通常建立一个概念性的数据模型(也称为信息模型)。概念性数据模型是一种面向问题的数据模型,是按照用户的观点对数据建立的模型。它描述了从用户角度看到的数据,它反映了用户的现实环境, 而且与在软件系统中的实现方法无关。…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

4. TypeScript 类型推断与类型组合

一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式&#xff0c;自动确定它们的类型。 这一特性减少了显式类型注解的需要&#xff0c;在保持类型安全的同时简化了代码。通过分析上下文和初始值&#xff0c;TypeSc…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开&#xff0c;快捷键也不好用&#xff0c;当看到 Cursor 升级后&#xff0c;还是蛮高兴的 1. 下载 Cursor 下载地址&#xff1a;https://www.cursor.com/cn/downloads 点击下载 Linux (x64) &#xff0c;…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…...