news 2026/2/11 4:48:04

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/8 16:07:25

SharedPreferences

SharedPreferencesSharedPreferences是一个接口&#xff0c;需通过Context提供的getSharedPreferences(String name,int mode)方法来获取SharedPreferences实例。SharedPreferences数据总是保存在/datta/data/<package name>/shared_prefs目录下。SharedPreferences数据总…

作者头像 李华
网站建设 2026/2/9 7:07:20

vue.3

1.局部注册只能在注册的组件内使用&#xff08;1&#xff09;创建vue文件&#xff08;2&#xff09;在使用的组件内导入并注册2.全局注册所有组件内都能使用&#xff08;1&#xff09;创建vue文件&#xff08;2&#xff09;main.js中进行全局注册3.组件的样式冲突scoped全局注册…

作者头像 李华
网站建设 2026/2/8 7:17:16

centos7-nvidia驱动安装及简单测试

centos7-nvidia驱动安装类别信息服务器型号Rack Mount Chassis NF5280M6CPUIntel Xeon Silver 4310 CPU 2.10GHz * 2系统版本Centos 7系统内核版本3.10.0-1160.el7.x86_64GPU型号NVIDIA A100&#xff08;40G&#xff09;*4Nvidia版本525.85.05CUDA版本12.0.0docker版本20.10.9…

作者头像 李华
网站建设 2026/2/5 1:57:28

BUCK-BOOST升降压电路Multisim电路仿真分析

目录 0 概述 工作过程简述 Q1 导通阶段 Q1 关断阶段 稳态输出 主要元件作用 电路特点 1 过程分析: 第一次开关闭合时 第二次Q1闭合时C1放电 2 Multisim仿真分析 占空比D=25% 占空比D=60% 摘要 本文分析了三极管型BUCK-BOOST升降压开关电源的工作原理。该电路结…

作者头像 李华