news 2026/5/4 21:35:47

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/5/4 15:42:01

解析UDS协议栈对NRC错误码的处理策略(全面讲解)

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。整体遵循“去AI化、强工程感、重逻辑流、轻模板化”的优化原则,摒弃所有刻板标题和套路化表达,以一位资深汽车电子诊断工程师的口吻娓娓道来,兼顾技术深度、教学价值与实战温度: 当ECU说“不”时,…

作者头像 李华
网站建设 2026/5/4 15:41:48

用Unsloth微调Gemma模型全过程:从准备到输出结果

用Unsloth微调Gemma模型全过程&#xff1a;从准备到输出结果 1. 为什么选Unsloth来微调Gemma&#xff1f; 你可能已经试过Hugging Face的Transformers PEFT组合&#xff0c;但每次训练都卡在显存不足、速度慢、配置复杂这三座大山前。Gemma这类现代开源大模型&#xff0c;参…

作者头像 李华
网站建设 2026/5/3 5:58:44

1. 突破限制:Wallpaper Engine资源管理的技术解决方案

1. 突破限制&#xff1a;Wallpaper Engine资源管理的技术解决方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 问题引入&#xff1a;壁纸资源管理的现实困境 每一位Wallpaper E…

作者头像 李华
网站建设 2026/5/1 13:39:51

Windows依赖分析工具使用指南

Windows依赖分析工具使用指南 【免费下载链接】Dependencies A rewrite of the old legacy software "depends.exe" in C# for Windows devs to troubleshoot dll load dependencies issues. 项目地址: https://gitcode.com/gh_mirrors/de/Dependencies 1. 工…

作者头像 李华
网站建设 2026/5/3 17:40:27

智能交互新范式:零代码AI桌面助手如何重塑你的数字生活

智能交互新范式&#xff1a;零代码AI桌面助手如何重塑你的数字生活 【免费下载链接】UI-TARS-desktop A GUI Agent application based on UI-TARS(Vision-Lanuage Model) that allows you to control your computer using natural language. 项目地址: https://gitcode.com/G…

作者头像 李华
网站建设 2026/5/1 9:02:14

漫画翻译神器:突破语言壁垒的开源解决方案

漫画翻译神器&#xff1a;突破语言壁垒的开源解决方案 【免费下载链接】manga-image-translator Translate manga/image 一键翻译各类图片内文字 https://cotrans.touhou.ai/ 项目地址: https://gitcode.com/gh_mirrors/ma/manga-image-translator 外语漫画阅读的三大痛…

作者头像 李华