Lambda表达式使用及详解

Java 8引入的Lambda表达式是一种重要的功能,它允许你以更简洁、更直接的方式传递方法。Lambda可以被用来代替只有单个抽象方法的接口的匿名实现类。这里有一些Lambda表达式的实际应用场景及其示例:

1. 集合操作

在处理集合时,如ListSet,Lambda表达式可以简化遍历、过滤、映射等操作。

示例:筛选大于10的数字

List<Integer> numbers = Arrays.asList(1, 2, 3, 11, 14);
numbers.stream().filter(n -> n > 10).forEach(System.out::println);

2. 排序操作

可以使用Lambda表达式轻松地对集合进行排序。

示例:按字符串长度排序

List<String> strings = Arrays.asList("apple", "banana", "cherry");
strings.sort((s1, s2) -> s1.length() - s2.length());
System.out.println(strings);

3. 事件监听器

在GUI编程中,Lambda可以简化事件处理器的定义。

示例:按钮点击事件

button.addActionListener(event -> System.out.println("Button clicked!"));

4. 并行处理

利用Lambda表达式和并行流可以很容易地实现多线程处理。

示例:并行求和

int sum = IntStream.rangeClosed(1, 100).parallel().sum();
System.out.println(sum);

5. 自定义函数

Lambda可以用来定义简单的函数,比如计算逻辑。

示例:两数相加

BinaryOperator<Integer> add = (x, y) -> x + y;
int result = add.apply(5, 3);
System.out.println(result); // 输出8

6. 在并发编程中作为任务

Lambda表达式可以作为RunnableCallable的任务提交给ExecutorService,便于管理并发任务。

示例:提交Lambda任务到线程池

ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(() -> {System.out.println("Task executed in separate thread.");
});
executor.shutdown();

这些示例展示了Lambda表达式如何使Java代码更加简洁、易读且功能强大,尤其是在处理集合、函数式编程和并发任务时。

7. 数据转换与映射

Lambda表达式在数据转换场景中同样大放异彩,能够轻松地将一种数据结构或类型转换为另一种。

示例:将字符串列表转换为大写

List<String> original = Arrays.asList("java", "lambda", "expressions");
List<String> uppercase = original.stream().map(s -> s.toUpperCase()).collect(Collectors.toList());
System.out.println(uppercase);

8. 函数复合

通过Lambda表达式,可以实现函数的复合,即结合多个函数以创建新的函数行为。

示例:组合函数计算平方和加倍

Function<Integer, Integer> square = x -> x * x;
Function<Integer, Integer> doubleValue = x -> x * 2;// 组合函数
Function<Integer, Integer> compositeFunction = square.andThen(doubleValue);int result = compositeFunction.apply(3); // 计算3的平方后加倍
System.out.println(result); // 输出36

9. 流式处理与条件分支

在复杂的流处理中,Lambda可用来实现条件分支,增强处理逻辑的灵活性。

示例:根据条件分类学生

enum Grade {PASS, FAIL}List<Student> students = ... // 学生列表Map<Grade, List<Student>> classifiedStudents = students.stream().collect(Collectors.groupingBy(student -> student.getScore() >= 60 ? Grade.PASS : Grade.FAIL));
// 输出通过和未通过的学生列表

10. 异常处理

虽然Lambda自身不直接支持异常声明,但可以通过外部函数或方法引用来优雅地处理异常。

示例:带异常处理的 Lambda 表达式

List<String> names = ... // 可能包含null值的姓名列表List<String> safeNames = names.stream().map(name -> {if (name != null) return name.toUpperCase();else throw new NullPointerException("Name cannot be null");}).collect(Collectors.toList());
// 实际应用中,应考虑使用try-catch或其它异常处理机制

通过上述示例可以看出,Lambda表达式不仅提升了代码的简洁度,还极大地增强了Java语言的功能性和表达力,特别是在处理高阶函数、函数式编程模式及并发编程等方面,使得开发者能够以更现代、更高效的方式编写Java代码。

11. 并发编程中的协调与控制

Lambda表达式在并发编程框架中扮演着协调者角色,如在CompletableFuture中用于定义异步任务的成功、失败或完成后的动作,提高了程序的响应性和性能。

示例:异步任务链

CompletableFuture.supplyAsync(() -> {// 模拟异步获取数据return "Data from remote service";
}).thenAccept(data -> {System.out.println("Received data: " + data);
}).exceptionally(ex -> {System.err.println("Error occurred: " + ex.getMessage());return null;
});

12. 自定义比较器

在需要自定义排序逻辑时,Lambda表达式提供了比传统匿名内部类更简洁的实现方式。

示例:按姓名长度降序排列

List<Person> people = ... // Person对象列表,假设包含getName()方法
people.sort((p1, p2) -> p2.getName().length() - p1.getName().length());

13. 构建复杂逻辑的Predicate

通过组合Predicate(谓词)Lambda,可以构建复杂的查询逻辑,实现高度灵活的条件筛选。

示例:复合条件筛选

Predicate<Person> isAdult = p -> p.getAge() >= 18;
Predicate<Person> isFemale = p -> "Female".equals(p.getGender());List<Person> filteredPeople = people.stream().filter(isAdult.and(isFemale)).collect(Collectors.toList());

14. Lambda与Optional的结合

在可能返回null的场景中,Lambda与Optional一起使用可以有效避免空指针异常,提高代码的健壮性。

示例:安全访问Optional值

Optional<String> optionalValue = Optional.ofNullable(getSomeValue());
optionalValue.ifPresent(value -> System.out.println("Value is present: " + value));

15. 在Stream API中实现归约操作

Lambda表达式在Stream的reduce操作中,用于实现从一系列值中计算出一个单一结果,如总和、平均值等。

示例:计算平均分

List<Integer> scores = ... // 分数列表
OptionalDouble average = scores.stream().mapToInt(Integer::intValue).average();
average.ifPresent(avg -> System.out.println("Average score: " + avg));

通过这些深入的应用场景,Lambda表达式不仅展现了其在简化日常编程任务上的威力,还在促进Java向更加函数式、响应式编程范式转变的过程中发挥着核心作用。随着开发者对Lambda特性的深入理解和应用,Java程序的可读性、可维护性和性能都有了显著提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/839435.shtml

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

相关文章

Oracle数据库中的PCTFREE解析

PCTFREE是Oracle数据库中用于表或索引段空间管理的一个重要存储参数。这个参数定义了一个数据块中保留的最小空闲空间百分比&#xff0c;旨在为现有行的未来更新预留空间。具体来说&#xff1a; 当设置一个数据块的PCTFREE值时&#xff0c;你实际上是告诉Oracle在这个数据块填满…

Spring Boot | Spring Boot 实现 “记住我“ 功能

目录: 一、SpringBoot 中 自定义 "用户授权管理" ( 总体内容介绍 )二、实现 "记住我" 功能 ( 通过 "HttpSecurity类" 的 rememberMe( )方法来实现 "记住我" 功能 ) :2.1 基于 "简单加密 Token" 的方式 ( 实现 "记住我&…

av_dump_format经验分析,FFmpeg获取媒体文件总时长(FLV获取总时长的误区)

播放器有个功能&#xff0c;当用户打开视频时&#xff0c;需要读取媒体文件的总时长等信息&#xff0c;不巧的时&#xff0c;获取FLV时总失败&#xff0c;下面来具体分析下FLV和MP4获取总时长的原因和区别&#xff1a; 播放器有个获取MediaInfo的接口&#xff0c;功能如下&am…

python web自动化(关键字驱动与POM)

1.关键字驱动解析 所谓的关键字驱动&#xff0c;本质就是函数封装的过程。 ⾃动化当中的封装⽬的是&#xff1a;拆分重复的⾏为代码和测试数据&#xff0c;增加可维护性和复⽤性 我们想要定义一个工具类 # 定义工具类&#xff08;基于基础的方法&#xff0c;进行的关键…

echarts全局设置饼图的颜色

&#x1f337;第一步 在js文件中写入你需要的颜色 这里的颜色也可以写渐变的 &#x1f337;下一步 在main.is中引用全局挂载 &#x1f337;最后一步 在初始化的时候加一个macarons即可 &#x1f337;第一步 在js文件中写入你需要的颜色 这里的颜色也可以写渐变的 (functi…

探索k8s集群中kubectl的陈述式资源管理

一、k8s集群资源管理方式分类 1.1陈述式资源管理方式&#xff1a;增删查比较方便&#xff0c;但是改非常不方便 使用一条kubectl命令和参数选项来实现资源对象管理操作 即通过命令的方式来实 1.2声明式资源管理方式&#xff1a;yaml文件管理 使用yaml配置文件或者json配置文…

【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法

文章目录 前言 Timer中断调度 Event中断调度 StateFlow调度 分析和应用 总结 参考资料 前言 近期在一些嵌入式系统开发项目中&#xff0c;在使用嵌入式处理器时&#xff0c;遇到了挺多费时费力的事情。所以利用晚上和周末时间&#xff0c;在这些方面深入研究了一下&…

全文索引-FullText

一、数据结构 倒排索引&#xff1a;存储单词与文档的映射 1、正向索引 正向索引结构如下: 文档1的ID→单词1的信息&#xff1b;单词2的信息&#xff1b;单词3的信息… 文档2的ID→单词3的信息&#xff1b;单词2的信息&#xff1b;单词4的信息… 2、反向索引 反向索引结构如…

AWS安全性身份和合规性之Inspector

Amazon Inspector 是一项漏洞管理服务&#xff0c;可持续扫描您的 AWS 工作负载&#xff0c;以查找软件漏洞和意外网络泄露。Amazon Inspector 会自动发现和扫描正在运行的亚马逊 EC2 实例、亚马逊弹性容器注册表 (Amazon ECR) Container Registry 中的容器映像&#xff0c;以及…

Joomla 3.7.0 (CVE-2017-8917) SQL注入漏洞环境

1 漏洞概述 Joomla是一个基于PHP的内容管理系统&#xff08;CMS&#xff09;&#xff0c;广泛应用于各类网站。2017年&#xff0c;Joomla 3.7.0版本被发现存在SQL注入漏洞&#xff08;CVE-2017-8917&#xff09;&#xff0c;攻击者可以利用该漏洞对数据库进行未授权查询或操作…

前端常用的状态码

常用状态码 常用状态码大家可以记一下&#xff0c;所有的也记不住&#xff0c;简洁几个字概括一下&#xff0c;方便大家进行记忆。 200 OK&#xff1a;请求成功 401 Unauthorized&#xff1a;未授权&#xff0c;未登录 403 Forbidde&#xff1a;已登录&#xff0c;但是对于…

The Sandbox 和 Bitkub 联手增强东南亚元宇宙中心

作为去中心化游戏虚拟世界和区块链平台的先驱&#xff0c;The Sandbox 正与泰国领先的区块链网络 Bitkub Blockchain Technology Co., Ltd. 展开创新合作。双方合作的目的是将Bitkub元宇宙的影响力扩展到The Sandbox&#xff0c;建立一个元宇宙中心&#xff0c;向用户承诺从 Bi…

C# GetManifestResourceStream 获取项目资源为null解决方案(亲测)

GetManifestResourceStream 获取项目资源为null 使用Stream s assembly.GetManifestResourceStream(Assembly.GetExecutingAssembly().GetName().Name resourceName) 获取资源文件&#xff0c;返回流为null&#xff0c;如图所示&#xff1a; 解决方案 设置资源文件的 属性&…

centos服务器常用清理脚本分享

做开发时&#xff0c;经常遇到服务器监控报警&#xff0c;日志占据大量的磁盘空间&#xff0c;需要清理。每次手动清理很麻烦。这里分享一些定时清理的脚本&#xff0c;减轻运维的工作量。将sh脚本与crontab定时任务结合&#xff0c;实现定时清理。 nacos日志清理脚本 nacos也…

WPF--几种常用定时器Timer汇总

1.WPF中常用4种Timer&#xff1a; System.Windows.Threading.DispatcherTimer(UI操作线程) 这是一个基于WPF Dispatcher的计时器。它可以在指定的时间间隔内触发Tick事件&#xff0c;并在UI线程上执行回调函数&#xff0c;方便进行UI更新操作。 System.Timers.Timer 这是一个基…

<MySQL> 【数据类型】

目录 一、数据类型一览 二、整型 &#xff08;一&#xff09;INT &#xff08;二&#xff09;BIT 三、浮点数 &#xff08;一&#xff09;FLOAT &#xff08;二&#xff09;DECIMAL &#xff08;三&#xff09;如何选择 四、字符 &#xff08;一&#xff09;CHAR &a…

超简单白话文机器学习 - 支持向量机SVM(含算法讲解,公式全解,手写代码实现,调包实现)

1. 支持向量机SVM 支持向量机&#xff0c;因其英文名为support vector machine&#xff0c;故一般简称SVM&#xff0c;通俗来讲&#xff0c;它是一种二类分类模型&#xff0c;其基本模型定义为特征空间上的间隔最大的线性分类器&#xff0c;其学习策略便是间隔最大化&#xff…

Redis教程(十四):Redis的三主三从集群搭建

Redis集群 Redis的集群是一种允许多个Redis节点在网络上互联并协作的技术,它为处理大规模数据提供了更高的性能和可扩展性,同时具有数据高可用性和故障容忍性。 以下是Redis集群的一些主要特性: 数据分片 在Redis集群中,数据会被分成多个部分,每个部分在不同的Redis节…

优雅草便民工具v2.0.4更新

优雅草便民工具v2.0.4更新 优雅草便民工具v2.0.4更新 2024年5月20日v2.0.4更新优雅草便民工具youyacao-tools-增加淘宝联想词功能和ai绘画功能apk下载 https://fenfacun.youyacao.com/tools204.apk 介绍 优雅草便民工具是一款由成都市一颗优雅草科技有限公司打造的便民查询公益…

JVM(8):虚拟机性能分析和故障解决工具之jinfo工具

1 jinfo(Configuration Info forJava)作用 实时地查看和调整虚拟机各项参数 2 命令格式 jinfo [options] 参数解释&#xff1a; 第一个参数&#xff1a;options no option&#xff1a;输出全部的参数和系统属性-flag name&#xff1a;输出对应名称的参数-flag [|-]name&am…