当前位置: 首页 > 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; 编程实…...

实体-联系图

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

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...