news 2026/4/18 7:12:45

303. Java Stream API - 查找元素

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
303. Java Stream API - 查找元素

文章目录

  • 303. Java Stream API - 查找元素
    • ✅ `findFirst()` 与 `findAny()` 方法概述
      • 🧠 关键点:
    • 🔢 有序流与无序流
      • 📌 **有序流**
      • 📌 **无序流**
      • 🎬 示例:处理有序流
        • 输出:
    • 🔄 `findAny()` 与并行流
      • 📌 `findFirst()` 的代价
      • 📌 为什么使用 `findAny()`?
      • 🎬 示例:并行流中的 `findFirst()` 和 `findAny()`
    • 🔀 有序流与无序流的区别
      • 📌 `unordered()` 方法
      • 🎬 示例:无序流中的 `findFirst()` 和 `findAny()`
      • 📌 `Set` 的无序性
    • ⚠️ 需要注意的性能问题
      • 📌 结论
    • 🧾 总结

303. Java Stream API - 查找元素


findFirst()findAny()方法概述

Stream API 提供了两个终止操作来查找流中的元素:

  • findFirst():返回流中的第一个元素。
  • findAny():返回流中的任意一个元素。

这两个方法都返回一个Optional 类型,如果流为空,它们返回的Optional也是空的。

🧠 关键点:

  • 如果流为空,返回的Optional为空。
  • 需要理解流的顺序性,因为它决定了findFirst()返回的是哪个元素。

🔢 有序流与无序流

📌有序流

有序流是指流中的元素顺序是有意义的,且由 Stream API 保持。比如:

  • 基于List创建的流通常是有序的。
  • 有序流中,可以明确地找到“第一个”、“第二个”或“第三个”元素。

📌无序流

无序流中的元素顺序没有固定,通常在流处理过程中,顺序可能会丢失或是随机的。例如,Set中的元素没有顺序性。

🎬 示例:处理有序流

Collection<String>strings=List.of("one","two","three","four","five");Stringfirst=strings.stream().filter(s->s.length()==3).findFirst().orElseThrow();// 获取第一个匹配的元素System.out.println("第一个匹配的元素: "+first);
输出:
第一个匹配的元素:one

在这个例子中,因为流是从List创建的,所以是有序流,findFirst()总是返回列表中的第一个匹配元素。


🔄findAny()与并行流

📌findFirst()的代价

在并行流中,调用findFirst()会带来性能开销,因为它需要确保返回的是流中的第一个元素,即使在并行处理中也要保持顺序。

📌 为什么使用findAny()

  • 如果你不关心返回流中的第一个元素,而只是需要流中的任意一个元素,那么应该使用findAny()
  • findAny()没有顺序约束,适用于处理并行流时,能提高性能。

🎬 示例:并行流中的findFirst()findAny()

Collection<String>strings=List.of("one","two","three","four","five");Stringresult=strings.stream().parallel()// 使用并行流.filter(s->s.length()==3).findFirst().orElseThrow();// 获取第一个匹配的元素System.out.println("并行流中的第一个匹配元素: "+result);

在并行流中,findFirst()仍然返回第一个匹配元素,但是有性能开销。如果你对顺序不关心,可以使用findAny()

StringanyResult=strings.stream().parallel().filter(s->s.length()==3).findAny().orElseThrow();// 获取任意一个匹配元素System.out.println("并行流中的任意匹配元素: "+anyResult);

🔀 有序流与无序流的区别

📌unordered()方法

调用unordered()方法后,流就变为无序流。在无序流中,findFirst()的结果将不再是第一个元素,而是流中的一个随机元素。

🎬 示例:无序流中的findFirst()findAny()

Collection<String>strings=List.of("one","two","three","four","five");Stringfirst=strings.stream().unordered()// 将流标记为无序流.filter(s->s.length()==3).findFirst().orElseThrow();// 获取第一个匹配元素System.out.println("无序流中的第一个匹配元素: "+first);

在此情况下,findFirst()仍然返回一个匹配的元素,但结果会随机。

📌Set的无序性

使用Set作为源时,元素本身就是无序的。例如:

Collection<String>strings=Set.of("one","two","three","four","five");Stringfirst=strings.stream().filter(s->s.length()==3).findFirst().orElseThrow();System.out.println("无序集合中的第一个匹配元素: "+first);

⚠️ 需要注意的性能问题

在并行流中,findFirst()操作需要确保元素顺序,而这可能会导致额外的性能开销。尤其是当流的处理只关注第一个匹配元素时,使用findAny()会更合适。

📌 结论

  • 有序流findFirst()会返回流中的第一个元素。
  • 无序流findFirst()findAny()都会返回流中的一个随机元素。
  • 并行流:使用findFirst()时会有性能开销,findAny()可以在不需要顺序时提升性能。

🧾 总结

方法适用场景顺序性返回类型
findFirst()查找第一个匹配的元素有序流Optional<T>
findAny()查找任意一个匹配的元素无序流Optional<T>
parallel()使流并行处理无序提升性能
unordered()使流无序无序流随机结果
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 0:08:13

开源AI编程助手:解决开发者三大困境的终端优化方案

开源AI编程助手&#xff1a;解决开发者三大困境的终端优化方案 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手&#xff0c;模型灵活可选&#xff0c;可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 作为一名技术顾问&#x…

作者头像 李华
网站建设 2026/4/18 3:50:30

YOLOv12官版镜像如何加载自定义数据集?教程来了

YOLOv12官版镜像如何加载自定义数据集&#xff1f;教程来了 在工业质检中自动识别微小划痕、在智慧农业场景下精准定位病害叶片、在物流分拣系统里实时区分上百种包裹类型——这些真实落地的视觉任务&#xff0c;正越来越依赖一个关键能力&#xff1a;快速适配自有数据的能力。…

作者头像 李华
网站建设 2026/4/18 5:40:54

基于Kibana的es可视化管理工具操作指南

以下是对您提供的博文内容进行 深度润色与专业重构后的版本 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、真实、有“人味”,像一位资深SRE在技术分享会上娓娓道来; ✅ 所有模块(原理、组件、实战、调试)有机融合,不再机械分节,逻辑层层递进; ✅…

作者头像 李华
网站建设 2026/4/17 7:26:31

ModelScope环境配置探索:从入门到精通的技术之旅

ModelScope环境配置探索&#xff1a;从入门到精通的技术之旅 【免费下载链接】modelscope ModelScope: bring the notion of Model-as-a-Service to life. 项目地址: https://gitcode.com/GitHub_Trending/mo/modelscope 环境配置的核心挑战&#xff1a;你需要知道的三个…

作者头像 李华
网站建设 2026/3/11 16:00:16

BiliBiliCCSubtitle:让B站字幕下载效率提升10倍的终极技巧

BiliBiliCCSubtitle&#xff1a;让B站字幕下载效率提升10倍的终极技巧 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 还在为B站字幕下载繁琐、格式不兼容、批量处…

作者头像 李华
网站建设 2026/3/14 6:04:47

告别996?这款低代码可视化编辑器让H5开发效率提升10倍

告别996&#xff1f;这款低代码可视化编辑器让H5开发效率提升10倍 【免费下载链接】h5-Dooring MrXujiang/h5-Dooring: h5-Dooring是一个开源的H5可视化编辑器&#xff0c;支持拖拽式生成交互式的H5页面&#xff0c;无需编码即可快速制作丰富的营销页或小程序页面。 项目地址…

作者头像 李华