Java Stream不可不知的使用技巧

深入解析 Java Stream 中不可变列表的陷阱 在日常 Java 开发中,使用 Stream API 处理集合是非常常见的操作。但如果不注意 Stream 返回的列表特性,很容易遇到运行时异常。在实际开发中,我们经常会在过滤、映射后需要对结果列表进行修改,这时如果使用了不可变列表,就会引发运行时异常。通过本文介绍的方法,你可以安全地处理 Stream 结果,避免这类常见错误。如果需要修改,务必使用上述可变列表的创建方式。对于可能被多次使用或传递的列表,建议在创建时就确保其可变性,避免后续操作受限。方法是为了提供更简洁的语法,但牺牲了列表的可变性。 阅读详情

Java Stream API 自 Java 8 引入以来,已经成为现代 Java 编程不可或缺的一部分。它简化了集合的操作,使代码更具可读性和表达力。本篇文章将为大家分享一些 Java Stream 的使用技巧,帮助你在日常开发中更加高效地使用 Stream。

1. 使用 filter 精确筛选数据

filter 是 Stream 的核心方法之一,用于对数据流进行条件筛选。例如:

List<String> names = List.of("Alice", "Bob", "Charlie", "David");
List<String> filteredNames = names.stream()
    .filter(name -> name.startsWith("A"))
    .collect(Collectors.toList());
System.out.println(filteredNames); // 输出:[Alice]

2. 利用 map 进行数据转换

map 方法可以将数据从一种形式转换为另一种形式。以下是将字符串列表转换为其长度的示例:

List<String> names = List.of("Alice", "Bob", "Charlie");
List<Integer> nameLengths = names.stream()
    .map(String::length)
    .collect(Collectors.toList());
System.out.println(nameLengths); // 输出:[5, 3, 7]

3. 用 flatMap 处理嵌套集合

当你需要处理嵌套集合时,flatMap 是非常有用的。例如:

List<List<Integer>> nestedList = List.of(
    List.of(1, 2, 3),
    List.of(4, 5, 6),
    List.of(7, 8, 9)
);
List<Integer> flatList = nestedList.stream()
    .flatMap(List::stream)
    .collect(Collectors.toList());
System.out.println(flatList); // 输出:[1, 2, 3, 4, 5, 6, 7, 8, 9]

4. reduce 实现聚合操作

reduce 方法用于将流中的元素合并为单一结果。例如,对列表中的数字求和:

List<Integer> numbers = List.of(1, 2, 3, 4, 5);
int sum = numbers.stream()
    .reduce(0, Integer::sum);
System.out.println(sum); // 输出:15

5. collect 收集数据到各种集合

collect 是 Stream 终端操作中最常用的方法之一,用于将流中的元素收集到集合中:

Set<String> uniqueNames = names.stream()
    .collect(Collectors.toSet());
System.out.println(uniqueNames);

或者,将结果收集到自定义的数据结构中:

Map<String, Integer> nameLengthMap = names.stream()
    .collect(Collectors.toMap(name -> name, String::length));
System.out.println(nameLengthMap); // 输出:{Alice=5, Bob=3, Charlie=7}

6. 利用 sorted 排序数据

sorted 方法可以对流中的元素进行排序。例如:

List<String> sortedNames = names.stream()
    .sorted()
    .collect(Collectors.toList());
System.out.println(sortedNames); // 输出:[Alice, Bob, Charlie]

还可以进行自定义排序:

List<String> reverseSortedNames = names.stream()
    .sorted(Comparator.reverseOrder())
    .collect(Collectors.toList());
System.out.println(reverseSortedNames); // 输出:[Charlie, Bob, Alice]

7. 并行流提升性能

对于大规模数据处理,可以使用并行流来提升性能:

List<Integer> largeList = IntStream.range(0, 1000000).boxed().collect(Collectors.toList());
long startTime = System.nanoTime();
long count = largeList.parallelStream()
    .filter(num -> num % 2 == 0)
    .count();
long endTime = System.nanoTime();
System.out.println("Count: " + count);
System.out.println("Time taken: " + (endTime - startTime) + " ns");

需要注意的是,并行流的性能提升取决于具体场景,使用时需谨慎。

8. 避免副作用,确保流操作的纯粹性

Stream 操作最好是无副作用的,避免在 forEach 或其他中间操作中修改外部状态。例如,以下写法可能引发意外错误:

List<String> result = new ArrayList<>();
names.stream()
    .filter(name -> name.startsWith("A"))
    .forEach(result::add); // 可能引发并发问题

推荐的方式是使用 collect 来收集结果:

List<String> filteredNames = names.stream()
    .filter(name -> name.startsWith("A"))
    .collect(Collectors.toList());

总结

本文介绍了一些 Java Stream API 的使用技巧,包括 filter、map、flatMap、reduce、collect 等常用操作,以及并行流和流操作的最佳实践。掌握这些技巧,将大大提升你的开发效率和代码质量。如果你还没有在项目中深入使用 Stream,不妨尝试将其引入日常开发,享受其带来的便利与强大功能。

Stream流&不可变集合 现在有两个ArrayList集合,第一个集合中:存储6名男演员的名字和年龄。第二个集合中:存储6名男演员的名字和年龄。姓名和年龄中间用逗号隔开。比如:张三, 23要求完成下面曹组:1、男演员只要名字为三个字的前两个人2、女演员只要姓杨的,并且不要第一个3、把过滤后的男演员姓名和男演员姓名合并到一起4、将上一步的演员信息凤凰城Actor对象5、将所有的演员信息都保存到List集合中备注:演员类Actor,属性只有两个:name和age// 现在有两个ArrayList集合, 阅读详情

相关推荐

Java8 Stream流使用

⏹Java Stream流使用

菜鸟记录 2231

Java Stream 流的常见用法和场景,以及注意事项

Java Stream 是 Java 8 引入的一个重要的功能,它允许你以声明性的方式对集合或其他数据源进行操作。Stream 流提供了一种高效、易读且功能强大的方式来处理数据集合,支持顺序和并行两种处理方式。Java Stream 流提供了一种高效、易读且功能强大的方式来处理数据集合。通过筛选过滤、映射转换、聚合操作、排序、去重、限制和跳过、匹配和查找、流的扁平化以及转换为其他集合形式等常见用法,可以方便地对数据进行各种操作。

qq_38566870的博客 1501

matianl:SAP 最详细的权限管理解析

上文所说的系统自带权限对象与权限字段仅能满足有限的需要,其权限审核的逻辑也是系统硬编码了的,我们能做的只是是否启用某项权限对象的检查(使用SU22)。如果需要自定义,通过SU20、SU21定义即可。

matinal 當冬夜漸暖 。公众号:matinal 2153

java 中Stream不可不知的几个问题

Java8 中的的stream非常好用,大部分的集合操作都可以实现。关于Stream的文章很多。这里只简单介绍一点调用问题。以便更好的理解Stream

2301_77345366的博客 315

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 412

Android开发者必看:5分钟搞定DeepSeek API接入(附完整代码示例)

本文为Android开发者提供快速接入DeepSeek API的完整指南,包含环境配置、网络层设计、请求体构建等关键步骤,并附有详细代码示例。通过工程化实践,帮助开发者高效集成AI对话、代码生成等高级功能,提升移动应用竞争力。

bush的博客 535

Java8 Stream 使用汇总

Java8 Stream 1 Stream概述 2 Stream的创建 3 Stream的使用 案例使用的员工类 3.1 遍历/匹配(foreach/find/match) 3.2 筛选(filter) 3.3 聚合(max/min/count) 3.4 映射(map/flatMap) 3.5 归约(reduce) 3.6 收集(collect) 3.6.1 归集(toList/toSet/toMap) 3.6.2 统计(count/averaging) 3.6.3 分组(partitioningBy/gr

Mr.zhao 5714

全局–局部傅里叶神经算子(GL-FNO):原理、严格推导与 PINN 混合策略

本文提出了一种全局-局部傅里叶神经算子(GL-FNO)及其与物理信息神经网络(PINN)的结合方法。主要内容包括: 架构设计:GL-FNO包含两个分支 - 全局分支处理低频结构,使用下采样输入;局部分支处理高频细节,使用全分辨率输入。两分支通过自适应门控机制融合。 理论分析:证明了GL-FNO在"低频全局+高频局部"任务上的优势,给出了误差分解和复杂度分析,并推导了与PINN结合时的渐进一致性条件。 实现方法:采用频谱微分计算物理残差,推导了完整的训练流程,包括数据损失与物理损失的联合优

VectorShift的博客 1330

第二十六讲 - Java不可变集合与Stream流

深入探索Java世界,领略编程之美。从基础语法到高级特性,从实战案例到性能优化,《Java后端学习路线》专栏带你领略编程的无穷魅力。无论你是初学者还是资深开发者,这里都有适合你的精彩内容。让我们一起在Java的世界里,书写代码的传奇! 欢迎大家支持订阅本专栏,后续内容更加精彩。

智潮先锋聚集地 1202

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘解决方案

本文主要介绍了AttributeError: module ‘lib’ has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK’解决方案,希望能对使用python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

STM32实现简单的智能电子相框

具体的代码案例和详细的代码实现超过5000字,无法在此篇文章中提供。但是,你可以参考STM32的官方文档和相应的图形库和多媒体库的文档,以获得更详细的实现细节和代码示例。对于硬件,我们可以选择使用STM32开发板,如STM32F4 Discovery。对于软件开发环境,我们将使用Keil MDK-ARM作为开发工具,并使用STM32CubeMX进行代码配置。在本文中,我们将使用STM32单片机实现一个简单的智能电子相框,包括显示照片、播放视频和音乐功能。接下来,我们将详细描述实现智能电子相框的步骤。

2401_85625565的博客 1004

Java8的Stream使用技巧归纳

首先创建一个user类和一个模拟产生user的方法 package jdk8的特性.Stream.跳过元素; /** * @author idea * @data 2018/9/8 */ public class User { private int id; private String username; private int sex; ...

Danny_idea的博客 2786

图解移动机器人中的运动规划(Motion Planning),附几十种规划算法

运动规划是移动机器人的核心理论和工程技术之一,本文作为教程先导,解析了运动规划的两大组件——路径规划和轨迹规划。欢迎感兴趣的同学订阅专栏!

FRIGIDWINTER的博客 4万+

重学Java基础篇—Stream的使用技巧

掌握 Stream 的使用技巧能显著提升代码简洁性和性能,但需根据场景权衡其优缺点。合理利用链式调用、短路操作和并行流,可让代码既优雅又高效。是一种高效处理集合数据的函数式编程工具,能够简化集合操作并提升代码可读性。:数据量大且处理耗时(如复杂计算)。在 Java 8 中,减少后续处理数据量。

有天你会让我妒忌的 1389

优快云专栏限时活动!福利公告必读!

本人优快云付费专栏周排名27名专业博主,每周文章平均阅读量约7w以上!

FJN110的博客 3152

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java 不可变集合的创建和Stream流的使用

java 不可变集合的创建和Stream流的使用

qq_51305563的博客 1135

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JAVA Stream debug技巧

JDK8 stream使用起来很方便,但是调试的话,却不像之前单步debug那样,能看到每一步的运行结果。 所以,idea有一个插件JAVA STREAM DEBUGGER插件,目前最新的idea2018,2019已经集成了该插件。 举个例子: 如下: package com.dushan.test.testInstance; import java.util.Arrays; import j...

dushan1234的专栏 1595

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java中Stream API的高级应用技巧

通过合理运用并行流、自定义Collector、结合Optional以及处理文件等操作,能使代码在保持简洁的同时,实现复杂的数据处理逻辑。Java 8引入的Stream API为集合操作带来了全新的编程体验,它以一种声明式、函数式的风格处理数据,使代码更简洁、易读。通过Files.lines获取文件行的Stream,再利用flatMap将每行字符串拆分为单词流,最后使用Collectors.groupingBy和Collectors.counting统计单词出现的频率,代码简洁高效。一、并行流的高效运用。

2501_91667082的博客 1628

Java不可变集合与Stream流

本文介绍了Java中不可变集合和Stream流的使用。不可变集合(包括List、Set、Map)创建后内容无法修改,适合存储固定数据如游戏规则等。Stream流是Java8引入的数据处理工具,提供过滤、映射、排序等中间操作和收集、遍历等终端操作,支持链式调用和延迟执行特性。文章详细演示了如何使用Stream流进行数据处理、转换和收集,包括各种中间操作和终端操作的具体实现方式。

清晓粼溪的博客 805

java集合——Stream流的使用

Java 8 引入了StreamAPI,这是一个用于处理集合数据的强大工具。Stream不是数据结构,而是一个来自数据源(如集合、数组或 I/O channel)的元素序列,并支持各种操作来转换和处理这些元素。Stream的设计受到了函数式编程语言的影响,它使得代码更加简洁和易于理解。

weixin_65019617的博客 1070

不可变集合及Stream流

若希望某个数据是不可修改的,就可以考虑使用不可变集合,以提高安全性;(JKD9之后才有)

zhuxs223的博客 1912

java8中stream最实用总结和调试技巧

背景        java8推出的集合操作流stream极大的方便了我们的开发,但stream支持的功能十分丰富,网上的介绍文章很全面但是不够实用不能很好满足开发中实际需要,在开发中也发现有些人对stream并不熟悉,或者只会使用简单的功能。如在代码审核中发现这样一段代码: ` /** * 从前10名中(可能存在重复)筛选出前五名 */ privat...

学习 7900

Java Stream 流的使用

在实际生产中,几乎很少使用for循环的结构进行操作,Java 8 提供的Stream可以大大提高程序员的生产力,由于自己之前对于Stream 流使用的并不是很熟练,所以在这里进行简单的总结归纳。 最后熟练的使用Stream流,不仅仅是对基础的熟悉,还是需要对于业务的一些理解需要比较深刻。

m0_46335449的博客 1125

10 个 Java Stream 顶级技巧,大量简化代码

10 个 Java Stream 顶级技巧,大量简化代码

LINgZone2的博客 652

Java进阶【十二期】:集合进阶:不可变集合(List、Set、Map(拓容)) & Stream流(流的使用、Stream流的中间方法、Stream流的终结方法) && Java中的方法引用

Java进阶【十二期】:集合进阶:不可变集合(List、Set、Map(拓容)) & Stream流(流的使用、Stream流的中间方法、Stream流的终结方法) && Java中的方法引用

Forever_Hopeful的博客 1046
上一篇: 使用 Java Streams 实现高效数据处理
下一篇: Java中的synchronized:深入理解与高效使用
codingexpert404
博客等级 码龄2年 196粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值