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 新特性:深入理解 Lambda 表达式的强大与应用 Lambda 表达式是 Java 8 引入的重要特性之一,它允许将匿名函数(即无名称的函数)作为参数传递给方法,简化了代码的编写,使代码更加简洁和易读。本文将深…...
HTML5 Canvas图形绘制技术应用
HTML5 Canvas图形绘制技术应用 目录 Canvas基础知识基本绘图操作路径操作文本绘制图像绘制变换复合图形与剪切阴影渐变动画与交互高级技巧...
JMETER工具:以录制手机app为例
JMETER工具:以录制手机app为例子 JMETER安装和环境配置 pc需要安装jdk,并进行jdk的环境配置,安装好jdk并配置好后,通过命令行输入java –version出现以下界面就表示安装成功: (对应的jdk版本不可太低&…...
PDF文件权限密码保护:如何去除及解决方法
如果你忘记了PDF文件密码,不用担心!PDF解密、找回密码、去除密码的方法简单易行。只需两步:1、打开百度搜索“密码帝官网”;2、在官网页面点击“立即开始”,上传文件,稍等片刻即可找回密码。这种方法安全、…...
【电子信息(工程)】电子通信创新创业教育综合
电子通信创新创业教育 阐述电磁场、电磁波和电磁频谱及应用一、电磁场 法拉第根据电流与磁场的关系,提出了电磁感应定律:如果电磁场中有处于运动状态下的闭合回路导体存在,流经该导体磁场的磁场强度和磁场量,通常都会出现相应的变化,电磁感应电流由此而产生。随后,英国的…...

光伏无人机巡检的工作原理是什么?
随着科技的飞速发展,无人机技术已经深入到众多领域,其中光伏电站的巡检工作便是其应用的一个重要方向。光伏无人机巡检,通过搭载各种先进的传感器和设备,对光伏电站进行全面的、高效的、安全的检测,为电站的运维管理提…...
泛型中K T V E ? Object等分别代表的含义
E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定的java类型&…...
常用损失函数学习
损失函数(Loss Function),在机器学习和统计学中,是用来量化模型预测输出与真实结果之间差异的函数。简而言之,损失函数衡量了模型预测的好坏,目标是通过最小化这个函数来优化模型参数,从而提高预…...
判断视频moov的位置
前言 MP4文件由若干称为Atom(或称为box)的数据对象组成,每个Atom的起首为四个字节的数据长度(Big Endian)和四个字节的类型标识,数据长度和类型标志都可以扩展。Atom可以嵌套,即其数据域可以由…...
python安装依赖
创建 requirement.txt 文件并填充内容 flask2.0.0 pandas1.3.3 numpy1.21.2 安装模块 pip install -r requirement.txt...

如何利用GitHubAction来发布自己的Python软件包
我们开发的python软件包如果想发布到网上,可以让其他人通过pip install下载,一般是把软件包发布到PYPI平台。 PYPI准备 我们要现在pypi注册登录一下 文件组织架构 一般的python软件包的文件组织架构为包名文件夹__init__.py程序,包文件夹的…...
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
摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对在线考试等问题,对如何通过计算…...
LangChain - 建立代理
本文翻译整理自:Build an Agent https://python.langchain.com/v0.2/docs/tutorials/agents/ 文章目录 一、说明概念 二、定义工具1、TavilyAPI参考: 2、RetrieverAPI参考:API参考: 3、工具 三、使用语言模型四、创建代理五、运行…...

爬虫案例:有道翻译python逆向
pip install pip install requestspip install base64pip install pycrytodome tools 浏览器的开发者工具,重点使用断点,和调用堆栈 工具网站:https://curlconverter.com/ 简便请求发送信息 flow 根据网站信息,preview,respon…...

仅需一块 4GB 的 GPU ,就能运行开源大语言模型:Llama3 70B
最强的开源大语言模型 Llama3 已经发布一段时间了,一些盆友资源有限,私信询问是否可以使用 4GB 的 VRAM 在本地运行 Llama3 70B。 与 GPT-4 相比,Llama3 的性能如何?Llama3 使用了哪些关键的前沿技术使其变得如此强大?…...
一战成电失败,二战上岸复旦!
这个系列会邀请往届学长学姐进行经验分享~ 本篇是复旦大学957来自专业课134分上岸同学的经验分享。 经验分享 大家好,大伙能点进这个帖子倍感荣幸。 先说一下个人情况吧,鼠鼠本科武汉大学物院,总共四年混了四年,绩点低&#x…...

27寸2K显示器 - HKC G27H2
HKC G27H2是一款面向电竞市场的高性能显示器,以其2K分辨率和180Hz的刷新率作为主要卖点,旨在为玩家提供流畅而清晰的视觉体验。配备HDR 400技术和95% DCI-P3色域覆盖,这款显示器还支持升降旋转支架,为用户提供了高度的人体工程学适…...
编程实战:类C语法的编译型脚本解释器(七)语句
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 系列入口: 编程实…...

实体-联系图
为了把用户的数据要求清楚、准确地描述出来,系统分析员通常建立一个概念性的数据模型(也称为信息模型)。概念性数据模型是一种面向问题的数据模型,是按照用户的观点对数据建立的模型。它描述了从用户角度看到的数据,它反映了用户的现实环境, 而且与在软件系统中的实现方法无关。…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...