news 2026/3/26 18:43:00

310. Java Stream API -大小特性和子大小特性流

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
310. Java Stream API -大小特性和子大小特性流

文章目录

  • 310. Java Stream API -大小特性和子大小特性流(Sized and Subsized Streams)
    • ✅ **SIZED 流**
      • 示例:
      • 示例代码:检查一个 `ArrayList` 是否是 SIZED 流
      • 输出:
    • ✅ **SUBSIZED 流**
      • **为什么有些流是 SUBSIZED 而有些不是?**
      • 示例代码:检查 `HashSet` 是否是 SUBSIZED 流
      • 输出:
    • ✅ **流转换对 SIZED 和 SUBSIZED 特性的影响**
      • 示例:映射流时保持特性
      • 输出:
      • 示例:过滤流时丧失特性
      • 输出:
    • ✅ **并行流的优化**
      • 小结:

310. Java Stream API -大小特性和子大小特性流(Sized and Subsized Streams)

在 Java 中,流的**大小特性(SIZED)子大小特性(SUBSIZED)**在处理数据时非常重要,尤其是在使用并行流时。掌握这两个特性有助于优化并行流的性能。

SIZED 流

SIZED流指的是已知流中元素的数量的流。简单来说,创建流时,如果能够提前知道流中元素的数量,那么这个流就是SIZED流。

示例:

  • 集合(Collection):所有实现了Collection接口的集合类(如ArrayListHashSet)都可以创建一个 SIZED 流,因为集合有一个size()方法,直接可以获取元素的数量。
  • 无法获取大小的流:某些流(如通过Files.lines(path)Pattern.splitAsStream(line)创建的流)不能在流创建时知道元素的数量,必须通过实际处理流的数据才能获得大小,因此它们不是 SIZED 流。

示例代码:检查一个ArrayList是否是 SIZED 流

Predicate<Stream<?>>isSized=stream->((stream.spliterator().characteristics()&Spliterator.SIZED)!=0);List<String>strings=newArrayList<>();System.out.println("ArrayList is sized? "+isSized.test(strings.stream()));

输出:

ArrayListis sized?true

这段代码演示了如何检查ArrayList创建的流是否具有SIZED特性。由于ArrayList可以在创建流时知道其大小,因此它是一个 SIZED 流。

SUBSIZED 流

SUBSIZED流涉及到流在并行处理时的分割方式。在并行流中,流会被分成多个部分并分配给不同的 CPU 核心进行计算。能够分割成相等大小子部分的流称为 SUBSIZED 流。

为什么有些流是 SUBSIZED 而有些不是?

  • ArrayListArrayList内部存储元素的数组非常适合分割,可以直接将其拆分成两个大小相等的部分,因此它是SIZEDSUBSIZED的流。
  • HashSet:虽然HashSet是 SIZED 流,但它的存储方式不同。由于HashSet是通过哈希算法存储元素的,无法直接知道如何将其拆分成大小相等的部分。因此,HashSet的流是 SIZED,但不是 SUBSIZED 流。

示例代码:检查HashSet是否是 SUBSIZED 流

Predicate<Stream<?>>isSubSized=stream->((stream.spliterator().characteristics()&Spliterator.SUBSIZED)!=0);Set<String>strings=newHashSet<>();System.out.println("HashSet is sized? "+isSized.test(strings.stream()));System.out.println("HashSet is subsized? "+isSubSized.test(strings.stream()));

输出:

HashSetis sized?trueHashSetis subsized?false

这段代码演示了如何检查一个HashSet创建的流是否是 SUBSIZED 流。虽然HashSet是 SIZED 流,但由于它的存储方式,无法分割成大小相等的子部分,因此它不是 SUBSIZED 流。

流转换对 SIZED 和 SUBSIZED 特性的影响

  • 保持 SIZED 和 SUBSIZED 特性:像map()sorted()等操作不会改变流的 SIZED 和 SUBSIZED 特性。
  • 丧失 SIZED 和 SUBSIZED 特性:像filter()distinct()flatMap()这样的操作会丧失流的 SIZED 和 SUBSIZED 特性。

示例:映射流时保持特性

Stream<String>nonSubSizedStream=Stream.of("apple","banana","cherry");Stream<String>mappedStream=nonSubSizedStream.map(String::toUpperCase);System.out.println("Mapped stream is sized? "+isSized.test(mappedStream));// truenonSubSizedStream=Stream.of("apple","banana","cherry");mappedStream=nonSubSizedStream.map(String::toUpperCase);System.out.println("Mapped stream is subsized? "+isSubSized.test(mappedStream));// true

输出:

Mappedstream is sized?trueMappedstream is subsized?true

这段代码演示了对流进行map()操作后,流仍然保留了 SIZED 和 SUBSIZED 特性。

示例:过滤流时丧失特性

Stream<String>filteredStream=nonSubSizedStream.filter(s->s.length()>5);System.out.println("Filtered stream is sized? "+isSized.test(filteredStream));// falseSystem.out.println("Filtered stream is subsized? "+isSubSized.test(filteredStream));// false

输出:

iltered stream is sized?falseFilteredstream is subsized?false

这段代码演示了对流进行filter()操作后,丧失了 SIZED ,SUBSIZED 特性。

并行流的优化

对于并行流,SIZED 和 SUBSIZED 特性尤其重要。通过确保流是 SIZED 且 SUBSIZED,可以使流在并行计算时更加高效。例如,当流的子部分大小已知时,流的并行执行能够更均匀地分配计算任务,从而减少处理时间。

小结:

  1. SIZED 流:知道流中元素的数量,适用于那些可以快速获取大小信息的数据源,如ArrayListHashSet
  2. SUBSIZED 流:能够将流分割成大小相等的部分,适用于那些数据结构具有明确划分和大小的流,如ArrayList
  3. 流转换:某些流操作(如map()sorted())会保留 SIZED 和 SUBSIZED 特性,而其他操作(如filter()flatMap()distinct())可能会丧失这些特性。
  4. 并行流优化:确保流是 SIZED 和 SUBSIZED 对于并行流的性能至关重要。

掌握这两个特性及其如何影响流的处理方式,可以帮助你在 Java 流处理中更好地优化性能,尤其是在并行处理时。

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

【小程序毕设源码分享】基于springboot+小程序的便民医疗服务的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/24 23:56:28

【小程序毕设全套源码+文档】基于微信小程序的便民医疗服务设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/3/14 5:13:46

基于peakcan/PCAN UDS上位机 (14229/15765) 可以开发UDS小工具

基于peakcan/PCAN UDS上位机 (14229/15765) 可以开发UDS小工具 新增支持CANFD的数据链路层通信最近在折腾汽车电子诊断工具开发&#xff0c;发现基于peakcan/PCAN硬件配合UDS协议栈搞上位机开发真是块宝藏。特别是支持CANFD之后&#xff0c;诊断效率直接起飞。今天就跟大家唠唠…

作者头像 李华
网站建设 2026/3/26 14:00:16

计算机技术与科学毕设易上手课题建议

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 基于协同过滤的…

作者头像 李华
网站建设 2026/3/15 12:22:05

Wallpaper Engine V2.5.28 离线版 + 30G精选壁纸资源(有彩蛋)

软件所在目录&#xff1a; 软件下载地址 直接扫一扫获取 备用地址 软件介绍 这是一款功能强大的PC动态壁纸工具&#xff0c;老司机们想必早已得心应手&#xff0c;尤其是创意工坊中那些隐藏内容&#xff0c;更是让人大开眼界。 首先&#xff0c;这个最新的Wallpaper Engine…

作者头像 李华
网站建设 2026/3/21 20:42:08

2026必备!8个降AIGC网站 千笔帮你高效降AI率

AI降重工具&#xff1a;让论文更自然&#xff0c;更专业 在当今学术写作中&#xff0c;AI生成内容&#xff08;AIGC&#xff09;已成为一种常见现象。然而&#xff0c;随着各大高校和期刊对AI痕迹的敏感度不断提升&#xff0c;如何有效降低AIGC率、去除AI痕迹并保持语义通顺&am…

作者头像 李华