1. Stream 操作分类

Stream 操作分为两类:

  1. 中间操作(Intermediate Operations)

    • 返回新的 Stream,可以链式调用(如 filtermapsorteddistinct)。

    • 惰性求值:只有遇到终止操作时才会执行。

  2. 终止操作(Terminal Operations)

    • 返回非 Stream 结果(如 collectcountsumforEach)。

    • 触发计算,执行所有中间操作。


2. 常用 Stream 操作

(1) 过滤:filter(Predicate<T>)

作用:筛选符合条件的元素。
示例:筛选以 "a" 开头的字符串。

java

List<String> list = List.of("apple", "banana", "avocado", "orange");
List<String> filtered = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
// 结果:["apple", "avocado"]

(2) 映射:map(Function<T, R>)

作用:将元素转换为另一种形式(如大小写转换、提取字段)。
示例:所有字符串转为大写。

java

List<String> upper = list.stream().map(String::toUpperCase).collect(Collectors.toList());
// 结果:["APPLE", "BANANA", "AVOCADO", "ORANGE"]

提取对象属性

java

List<Person> people = ...;
List<String> names = people.stream().map(Person::getName).collect(Collectors.toList());

(3) 排序:sorted() / sorted(Comparator<T>)

作用:按自然顺序或自定义比较器排序。
示例:按字母顺序排序。

java

List<String> sorted = list.stream().sorted().collect(Collectors.toList());
// 结果:["apple", "avocado", "banana", "orange"]

自定义排序(按字符串长度):

java

List<String> sortedByLength = list.stream().sorted(Comparator.comparing(String::length)).collect(Collectors.toList());
// 结果:["apple", "banana", "orange", "avocado"]

(4) 去重:distinct()

作用:去除重复元素(依赖 equals() 和 hashCode())。
示例

java

List<String> withDuplicates = List.of("a", "b", "a", "c");
List<String> distinct = withDuplicates.stream().distinct().collect(Collectors.toList());
// 结果:["a", "b", "c"]

(5) 聚合操作

计数:count()

java

long count = list.stream().count(); // 4
求和:mapToInt() + sum()

java

List<String> numbers = List.of("1", "2", "3");
int sum = numbers.stream().mapToInt(Integer::parseInt).sum(); // 6
求最大值/最小值

java

Optional<String> max = list.stream().max(Comparator.naturalOrder());
Optional<String> min = list.stream().min(Comparator.comparing(String::length));
匹配检查
  • anyMatch(Predicate<T>)(任一元素匹配)

  • allMatch(Predicate<T>)(所有元素匹配)

  • noneMatch(Predicate<T>)(无元素匹配)

java

boolean hasA = list.stream().anyMatch(s -> s.contains("a")); // true

3. 终止操作:collect(Collectors.toList())

collect() 是常用的终止操作,用于将流转换为集合或其他数据结构。
常见 Collectors 方法

方法作用
Collectors.toList()转为 List
Collectors.toSet()转为 Set(自动去重)
Collectors.joining(delimiter)拼接字符串
Collectors.groupingBy(Function)按条件分组
Collectors.partitioningBy(Predicate)按条件分区(true/false)

示例

java

// 拼接字符串
String joined = list.stream().collect(Collectors.joining(", "));
// 结果:"apple, banana, avocado, orange"// 分组(按首字母)
Map<Character, List<String>> grouped = list.stream().collect(Collectors.groupingBy(s -> s.charAt(0)));
// 结果:{'a': ["apple", "avocado"], 'b': ["banana"], 'o': ["orange"]}

4. 并行流(Parallel Stream)

通过 parallelStream() 利用多核 CPU 加速计算(适合大数据量)。
示例

java

List<String> parallelProcessed = list.parallelStream().map(String::toUpperCase).collect(Collectors.toList());

注意

  • 并行流不保证顺序。

  • 小数据量可能更慢(线程开销)。


5. 完整示例

java

List<String> fruits = List.of("apple", "banana", "avocado", "orange", "apple");// 过滤 + 映射 + 去重 + 排序
List<String> result = fruits.stream().filter(s -> s.length() > 5)       // 筛选长度 >5.map(String::toUpperCase)          // 转大写.distinct()                        // 去重.sorted()                          // 排序.collect(Collectors.toList());     // 转为 List// 结果:["AVOCADO", "BANANA", "ORANGE"]

6. 总结

操作方法示例
过滤filter(Predicate).filter(s -> s.startsWith("a"))
映射map(Function).map(String::toUpperCase)
排序sorted().sorted(Comparator.reverseOrder())
去重distinct().distinct()
聚合count()sum().mapToInt(Integer::parseInt).sum()
收集collect(Collectors.toList()).collect(Collectors.joining(", "))

适用场景

  • 需要对集合进行复杂处理(如过滤、转换、分组)。

  • 代码可读性比性能更重要(小数据量)。

  • 并行流适合大数据计算(如日志分析、批量处理)。

传统循环 vs Stream

java

// 传统方式(繁琐)
List<String> filtered = new ArrayList<>();
for (String s : list) {if (s.startsWith("a")) {filtered.add(s.toUpperCase());}
}// Stream 方式(简洁)
List<String> filtered = list.stream().filter(s -> s.startsWith("a")).map(String::toUpperCase).collect(Collectors.toList());

Stream API 让代码更符合 “做什么” 而非 “怎么做” 的编程风格,推荐在 Java 8+ 项目中广泛使用!

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

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

相关文章

「源力觉醒 创作者计划」_文心大模型4.5系列开源模型, 从一行代码到一个生态:聊聊开源战略那些事儿,顺便扯扯文心大模型 4.5 的使用心得

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录从一行…

算法专题(二)回文链表

1、源代码class Solution {public boolean isPalindrome(ListNode head) {ListNode fasthead,slowhead; //快慢指针都在头结点//快指针走2步&#xff0c;慢指针走一步。//双数快指针最后是null&#xff0c;单数快指针下一位是nullwhile(fast!null && fast.next!null){f…

2025《艾诺提亚失落之歌》逆向工程解包尝试

前言 想开发一下光明之魂&#xff0c;看能不能解包《艾诺提亚失落之歌》的模型。 之前写了&#xff08;https://blog.csdn.net/weixin_42875245/article/details/148616547?spm1001.2014.3001.5501&#xff09; 沿用这个思路进行逆向工程解包。 文章目录请添加图片描述前言…

JVM 03 类加载机制

JVM 将字节码二进制流加载到内存称为类加载。 什么时候加载类 new 实例化对象。而对象所属类还没被加载。读取/设置类的静态非常量字段&#xff0c;常量字段在常量池。调用类的静态方法。类初始化&#xff0c;优先初始化父类。虚拟机启动时&#xff0c;先加载用户指定的主类。 …

STM32H7+FreeRTOS+LwIP移植EtherCAT开源主站SOEM

代码下载什么的就不多说了&#xff0c;直接看需要移植修改的代码。 1、osal.c修改 /******************************************************************************* * *** **** *** *** …

VijosOJ:中文信息学竞赛的二十年开源之路

VijosOJ&#xff1a;中文信息学竞赛领域的老牌开源在线判题系统 在中文编程教育与信息学竞赛的发展历程中&#xff0c;在线判题系统&#xff08;OJ&#xff09;扮演了至关重要的角色。它们不仅是选手训练的 “战场”&#xff0c;更是知识传递与社区交流的枢纽。VijosOJ&#x…

QPainter::CompositionMode解析

基本概念目标(Destination)&#xff1a;已经存在的像素。源(Source)&#xff1a;要绘制的新像素。组合模式&#xff1a;决定源和目标如何混合。总结SourceOver&#xff1a;源绘制在目标之上。DestinationOver&#xff1a;目标绘制在源之上。Clear&#xff1a;二者重叠区域被清空…

对接钉钉审批过程记录(C#版本)

钉钉开放平台&#xff1a;API总览 - 钉钉开放平台 按照开放平台操作指引&#xff0c;进入到钉钉开发者后台&#xff1a;开发者后台统一登录 - 钉钉统一身份认证&#xff0c;进行应用创建。 按照开放平台指引下载钉钉SDK&#xff08;新版&#xff09;。 在vs引入钉钉dll文件。 获…

AFSIM入门教程03.03:更新所有依赖库版本

系列索引&#xff1a;AFSIM入门教程索引 上一篇中更新了tiff库版本&#xff0c;本文将更新所有使用到的依赖库版本。 失败了 依赖库 首先获取哪些库被使用了。打开源码目录&#xff0c;搜索# Configure the 3rd_party&#xff0c;可以看到调用第三方库的代码。 官方提供的…

完美解决hive external表中csv字段内容含“,“逗号的问题

为解决hive表中csv字段内容含","逗号的问题&#xff0c;网上几乎都是说要用org.apache.hadoop.hive.serde2.OpenCSVSerde。 使用方法为&#xff1a; 1、mysql导出时&#xff0c;加一个ENCLOSED BY ‘"’&#xff0c; 示例&#xff1a; mysql -h 10.16.0.10 -P …

【Git】修改本地和远程的分支名称

其原理是&#xff1a; 对于本地&#xff1a;可直接修改分支名称&#xff1b;对于远程&#xff1a;不可直接重命名分支&#xff0c;所以应该将修改好名称的分支以新分支的形式推送上远程仓库&#xff0c;之后将新分支与远程新分支关联&#xff0c;之后可选择删除旧分支# 例子&am…

ubuntu24.04安装selenium、chrome、chromedriver

实验环境&#xff1a;kaggle notebook、colab notebook1、安装chrome!wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb!sudo dpkg -i google-chrome-stable_current_amd64.deb!sudo apt-get install -f!export QT_QPA_PLATFORMoffscreen!sudo…

西门子PLC基础指令6:读取时钟指令、设置时钟指令、使能含义与注意

读/写指令 1. 读取时钟 指令 READ_RTCREAD_RTC &#xff08;RTC 全称是 Real - Time Clock&#xff0c;即实时时钟 &#xff09;指令的主要作用是将 CPU 内部实时时钟&#xff08;RTC&#xff09;的当前日期和时间信息读取出来&#xff0c;并存储到以指定字节地址&#xff08;图…

GeoTools 结合 OpenLayers 实现缓冲区分析

前言❝ 缓冲区分析是地理信息系统&#xff08;GIS&#xff09;空间分析的核心功能之一。它通过围绕点、线或面等地理实体&#xff0c;自动生成指定距离&#xff08;或宽度&#xff09;的等距区域&#xff08;缓冲区&#xff09;。该功能为量化空间邻近度、评估影响范围、识别潜…

SpringBoot 接入SSE实现消息实时推送的优点,原理以及实现

SpringBoot 接入SSE实现消息实时推送的优点,原理以及实现 前言 上一篇文章 我写的关于SpringBoot整合t-io是websocket实时通信的文章中我们可以了解到 websocket是双向通信的,而且需要TCP连接的支持,今天在这里我要说的SSE(Server-Sent Events) 是一个单项通信的消息实时推…

创建型设计模式:对象诞生的艺术与智慧

&#x1f3ad; 创建型设计模式&#xff1a;对象诞生的艺术与智慧 &#x1f4a1; 温馨提示&#xff1a;本文将以轻松有趣的方式带你探索设计模式的世界&#xff0c;就像在听一个关于"如何优雅地生孩子"的故事一样&#xff01; &#x1f6aa; 传送门&#xff1a;在开始…

如何解决pip安装报错ModuleNotFoundError: No module named ‘gensim’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘gensim’问题 摘要 在使用 PyCharm 2025 进行 Python 开发时&#xff0c;常常需要通过 pip install 安装第三方包以丰富项目功能。但在安装 gensim 等包时&…

【嵌入式电机控制#26】BLDC:三相模拟采集

之前有些网友试着用有刷的平均电流法采集三相&#xff0c;还搞了个闭环控制。求&#xff01;结果直接把驱动板给干没了......做过仿真的朋友们都知道&#xff0c;无刷电机的相电流波形是介于方波和正弦波的。如果拿平均电流去测量&#xff0c;很不靠谱。这节内容为大家分享采集…

ref存储对象和reactive深度响应式递归地对对象的嵌套属性进行响应式处理

ref 不会递归地对 对象 或 数组 中的每个属性或元素进行深度响应式处理。如果你需要递归处理嵌套属性&#xff0c;reactive 是更适合的选择。让我通过具体的例子来展示这一点。 例子&#xff1a;ref 存储对象和嵌套对象 1. 使用 ref 存储嵌套对象&#xff1a; import { createA…

小鹏汽车前端面经

前端基础与浏览器机制 (Front-End Fundamentals & Browser Mechanics) 这些问题涵盖了Web工作的基本原理&#xff0c;包括网络、渲染和浏览器特性。 1. 浏览器渲染与性能 (Browser Rendering & Performance) URL输入发生什么&#xff1f;(What happens when you type a…