news 2026/4/30 1:28:05

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/4/22 21:12:17

马斯克“无钱论”:乌托邦愿景还是技术狂想?

对马斯克“未来没有钱的概念”&#xff0c;我的态度是短期不成立&#xff0c;长期存想象空间&#xff0c;核心在于技术落地、社会治理与价值定义三大变量的现实约束。一、马斯克的核心逻辑1. 货币本质是劳动力分配的数据库&#xff0c;AI与机器人&#xff08;如Optimus&#xf…

作者头像 李华
网站建设 2026/4/23 10:56:00

Codeforces Round 1068 (Div. 2) D,E 题解

D. Taiga’s Carry Chains Miracles don’t happen to those who just wait. — Toradora! After classes at Ohashi High School, Ryuuji hands Taiga a positive integer n n n and sets a simple challenge. They will play for exactly k k k moves. In a single mov…

作者头像 李华
网站建设 2026/4/27 9:08:46

win11卸载sql server express版本

1. 停止服务 步骤关键操作说明 / 注意1. 停止服务停止所有 “SQL Server (实例名)” 等相关服务。防止文件被占用导致无法删除。 2. 卸载程序 步骤关键操作说明 / 注意2. 卸载程序在“控制面板”-“程序和功能”中&#xff0c;卸载所有名称包含 “SQL Server” 和 “Native C…

作者头像 李华
网站建设 2026/4/20 3:32:57

基于VLAN标签的网络访问控制实验报告

实验配置步骤交换机LSW1配置交换机LSW2配置交换机LSW3配置路由器AR1配置访问控制验证&#xff08;ping测试&#xff09;pc1 ping pc6 pc3访问pc23456pc2访问pc456pc4可以访问pc5&#xff0c;不能访问pc6pc5不能访问pc6

作者头像 李华
网站建设 2026/4/21 20:00:54

双非本能搞智驾吗?座舱相关开发怎样?

前言 注&#xff1a;文中所说观点&#xff0c;系个人胡扯观点。观看如有不适&#xff0c;既可私信阿甘本人删文。 星球同学提问 halo甘哥&#xff0c;想问问 1⃣️双非本适合走自动驾驶的开发方向吗 2⃣️如果想去一个比较知名的车企实习&#xff0c;开发岗如果进不去&#xff…

作者头像 李华
网站建设 2026/4/27 23:45:57

项目实战: LAMP-电商平台-iwebshop

LAMP-电商平台-iwebshop # 配置服务器流程&#xff1a; # 1. 安装软件包 # 2. 准备相关材料 # 3. 修改配置文件 # 4. 启用并启动服务 # 5. 设置防火墙 # 6. 客户端测试####################################################### 10.1.8.11 client.migaomei.cloud client 10.1.…

作者头像 李华