news 2026/3/10 5:56:59

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/3/9 18:58:37

彻底爆了!阿里最新大模型,再次拿下第一!

你好&#xff0c;我是郭震这周末有读者问我&#xff0c;现在解决复杂问题最好的AI模型都有哪些&#xff1f;这篇文章我来给分析总结下这个问题&#xff0c;感兴趣的朋友可以看看这篇文章。大家有没有注意到&#xff0c;现在的大模型发展趋势正在从“拼参数”转向“拼逻辑”。简…

作者头像 李华
网站建设 2026/3/10 2:37:30

社会网络仿真软件:Gephi_(18).社会网络分析理论基础

[[# 社会网络分析理论基础 社会网络的基本概念 社会网络是指个体或组织之间的社会关系构成的网络结构。这些社会关系可以是多种多样的&#xff0c;包括但不限于友谊、合作、通讯、交易等。社会网络分析&#xff08;Social Network Analysis, SNA&#xff09;是一种研究社会网…

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

ES6新增了哪些新特性

1. let/const 声明变量(彻底替代 var) 解决var的变量提升、没有块级作用域、可重复声明三大问题,是 ES6 最基础也是最必须的特性。 let:声明可变的块级作用域变量,不可重复声明,无变量提升(暂时性死区); const:声明不可变的块级作用域常量,必须初始化,不可重复声明…

作者头像 李华
网站建设 2026/3/8 3:02:29

目前全网唯一的Autosar TLS文章

0.目录 1. Autosar TLS总览 2. 支持的特征、加密套件 3. 存在的限制 4. TLS模块设计的API 定义 5. TLS相关配置 6. 与CSM模块的交互 https://mp.weixin.qq.com/s/TOLbCVuEyYmrZ0nRHFtFUQ

作者头像 李华
网站建设 2026/3/8 16:39:16

我的思维模型 -- 5.工程学篇

工程学反脆弱&#xff08;波动 - 成长&#xff09;有些事物能从冲击中受益&#xff0c;当暴露在波动性、随机性、混乱和压力之下时&#xff0c;它们反而能茁壮成长系统可能需要一些压力和刺激&#xff0c;人们可能会在某一领域中体会到这一点&#xff0c;但在其他领域却全然忽略…

作者头像 李华