news 2026/3/1 6:17:49

306. Java Stream API - 流特性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
306. Java Stream API - 流特性

文章目录

  • 306. Java Stream API - 流特性
    • ✅ 什么是 Stream 的特性?
      • 🧠 特性概述:
      • ⚠️ 其他特性:
    • ✅ 如何检查 Stream 的特性
        • 输出:
      • 解释:
    • ✅ 详细介绍每个流特性
      • 🎬 **ORDERED(有序)**
        • 示例:判断流是否为有序流
        • 输出:
        • 移除顺序特性:
        • 输出:
      • 🎬 **DISTINCT(去重)**
        • 示例:检查流的去重特性
        • 输出:
      • 🎬 **NONNULL(无 null 元素)**
        • 示例:检查流是否包含 null 元素
        • 输出:
      • 🎬 **SORTED(已排序)**
        • 示例:检查流是否已排序
        • 输出:
      • 🎬 **SIZED(已知大小)**
    • ✅ 总结

306. Java Stream API - 流特性

在 Java Stream API 中,每个流(Stream)都具有一些特性,这些特性定义了流如何处理数据,以及这些数据是否具有某些特定的属性。这些特性对编写高效的流管道非常重要,尤其是在使用并行流时。


✅ 什么是 Stream 的特性?

Stream API 使用一个特殊的对象——Spliterator,来描述流的特性。Spliterator 接口的名字来源于它在流处理中的作用,它的功能类似于迭代器(Iterator)在集合(Collection)中的作用。此外,Spliterator 还控制并行流如何将元素分配到不同的 CPU 上进行处理。

🧠 特性概述:

  • ORDERED:流中的元素处理顺序是有意义的。
  • DISTINCT:流中的元素没有重复项。
  • NONNULL:流中的元素没有null值。
  • SORTED:流中的元素是排序的。
  • SIZED:流处理的元素数量是已知的。
  • SUBSIZED:分割该流时,得到的子流也是 SIZED 的。

⚠️ 其他特性:

  • IMMUTABLECONCURRENT特性在此教程中未涉及。

流的特性由流的来源、所执行的操作以及该流是如何创建的来决定。理解这些特性有助于我们在开发中做出更加高效和有针对性的优化。


✅ 如何检查 Stream 的特性

如果你想检查一个流是否具备某种特性,可以通过Spliteratorcharacteristics()方法来实现。该方法返回一个包含多个标志位的整数,每个标志位代表流的不同特性。

例如,我们可以编写一个判断流是否具备ORDERED特性的谓词(Predicate):

Predicate<Stream<?>>isOrdered=stream->((stream.spliterator().characteristics()&Spliterator.ORDERED)!=0);Stream<Integer>stream=List.of(1,2,3).stream();booleanordered=isOrdered.test(stream);System.out.println("ordered = "+ordered);
输出:
ordered=true

解释:

  • 这段代码通过spliterator()方法获取流的Spliterator,然后使用位运算来判断该流是否具有ORDERED特性。
  • 如果流的来源是List,那么它默认是有序的,因此ORDERED特性会被设置为true
  • 如果你将List替换为Set,你会发现ORDERED特性不再存在,因为Set中的元素顺序是不可预测的。

✅ 详细介绍每个流特性

🎬ORDERED(有序)

如果流是从有序的数据源创建的,那么它就是有序流。例如,List接口的实例,以及Files.lines(path)Pattern.splitAsStream(string)等方法都会产生有序流。

对于有序流,元素的顺序是非常重要的。然而,在并行流中保留元素顺序可能会带来性能开销。若你不关心顺序,可以通过unordered()中间操作移除流的ORDERED特性。

示例:判断流是否为有序流
Stream<String>orderedStream=List.of("apple","banana","cherry").stream();booleanisOrdered=isOrdered.test(orderedStream);System.out.println("Is ordered: "+isOrdered);
输出:
Isordered:true

对于List流,默认是有序的,因此返回true

移除顺序特性:
Stream<String>unorderedStream=orderedStream.unordered();booleanisOrderedAfterUnordered=isOrdered.test(unorderedStream);System.out.println("Is ordered after unordered: "+isOrderedAfterUnordered);
输出:
Isordered after unordered:false

通过unordered()操作,我们可以将有序流转换为无序流,进而移除ORDERED特性。


🎬DISTINCT(去重)

流中的元素是去重的,意味着没有重复的元素。如果流的元素可以被去重,那么该流具有DISTINCT特性。例如,Stream.of(1, 2, 2, 3)会返回一个不包含重复项的流。

示例:检查流的去重特性
Stream<Integer>distinctStream=Stream.of(1,2,2,3).distinct();booleanisDistinct=distinctStream.allMatch(newHashSet<>()::add);System.out.println("Is distinct: "+isDistinct);
输出:
Isdistinct:true

🎬NONNULL(无 null 元素)

如果流中的元素不包含null,那么该流具有NONNULL特性。Stream.of(1, 2, 3)就是一个没有null元素的流。

示例:检查流是否包含 null 元素
Stream<String>nonNullStream=Stream.of("apple","banana","cherry");booleanhasNull=nonNullStream.anyMatch(Objects::isNull);System.out.println("Contains null: "+hasNull);
输出:
Containsnull:false

🎬SORTED(已排序)

如果流的元素是有序的,那么该流具有SORTED特性。这意味着流中的元素是按照某种规则排序的,例如按升序或降序排列。

示例:检查流是否已排序
Stream<Integer>sortedStream=Stream.of(3,1,2).sorted();booleanisSorted=sortedStream.isOrdered();System.out.println("Is sorted: "+isSorted);
输出:
Issorted:true

🎬SIZED(已知大小)

如果流的大小是已知的,即流处理的元素数量是确定的,那么该流具有SIZED特性。比如,ListSet流都是有大小的。


✅ 总结

了解和利用流的特性,可以帮助我们在编写高效的流管道时做出更好的决策。例如,知道一个流是否是有序的,可以让我们在并行流处理中避免不必要的性能开销。如果你不关心元素的顺序,使用unordered()可以显著提高并行流的性能。

通过Spliterator获取流的特性,我们可以为流操作添加更细粒度的优化,尤其是在处理大量数据时,能让程序运行更加高效。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 20:41:53

翱捷科技 Android/Linux 芯片平台功耗软件工程师:核心技术解析与实战

翱捷科技股份有限公司 Android/Linux芯片平台功耗软件工程师 (MJ000299) 职位信息 岗位职责 在公司自研芯片平台(SoC)上,负责: 1. Linux系统clock,idle,CPU freq,thermal,battery,charger等底层驱动开发。 2. Android thermal/charger health/power hint等HAL的开发。…

作者头像 李华
网站建设 2026/2/28 13:41:14

LeetCode 3650.边反转的最小路径总成本:Dijkstra算法

【LetMeFly】3650.边反转的最小路径总成本&#xff1a;Dijkstra算法 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-cost-path-with-edge-reversals/ 给你一个包含 n 个节点的有向带权图&#xff0c;节点编号从 0 到 n - 1。同时给你一个数组 edges&#xf…

作者头像 李华
网站建设 2026/2/24 10:12:40

实测缩短70%课件制作时间:这款AIPPT工具就是老师的大救星

实测缩短70%课件制作时间&#xff1a;ChatPPT引领教学效率革命 实测数据显示&#xff0c;使用ChatPPT制作课件&#xff0c;基础构建时间可缩短70%以上&#xff0c;这不是夸张&#xff0c;而是众多教育工作者的真实反馈。在2026年的今天&#xff0c;课件制作正经历着一场由AI驱动…

作者头像 李华
网站建设 2026/2/24 19:26:17

CoDeSys入门实战一起学习(二十):布尔、整型、实数、字符串、时间5大类标准数据类型详解(附实战案例)

写CoDeSys程序的第一步&#xff0c;必然是声明变量/常量&#xff0c;而所有声明都离不开数据类型。CoDeSys的标准数据类型完全遵循IEC61131-3标准&#xff0c;共分为布尔、整型、实数、字符串、时间5大类&#xff0c;是所有PLC程序的“基础积木”。很多新手容易踩坑&#xff1a…

作者头像 李华
网站建设 2026/1/31 7:45:53

KingbaseES数据库瓶颈排查实战指南:从实例到语句的全维度解析

在高并发、海量数据的业务场景下&#xff0c;数据库性能直接决定了应用系统的响应速度和稳定性&#xff0c;而瓶颈排查则是性能调优的核心前提——只有精准定位问题根源&#xff0c;才能避免盲目调参、优化无效的内耗。KingbaseES作为国产数据库中的优秀代表&#xff0c;在政务…

作者头像 李华
网站建设 2026/2/26 12:18:16

巡防勤务可视化管理

巡防勤务可视化管理 巡防勤务管理可视化系统&#xff0c;基于大数据平台的警务地理信息系统&#xff0c;可以实时查看警力在岗状态、警力分布、应急资源等。系统支持快速定位警员、车辆的位置&#xff0c;查看警力详细信息&#xff0c;调取监控视频画面&#xff0c;并进行单方…

作者头像 李华