核心内容摘要
苹果电影未测减除版
文章目录
Java Stream API -大小特性和子大小特性流Sized and Subsized Streams✅ **SIZED 流**示例示例代码检查一个 ArrayList 是否是 SIZED 流输出✅ **SUBSIZED 流****为什么有些流是 SUBSIZED 而有些不是**示例代码检查 HashSet 是否是 SUBSIZED 流输出✅ **流转换对 SIZED 和 SUBSIZED 特性的影响**示例映射流时保持特性输出示例过滤流时丧失特性输出✅ **并行流的优化**小结
Java Stream API -大小特性和子大小特性流Sized and Subsized Streams在 Java 中流的**大小特性SIZED和子大小特性SUBSIZED**在处理数据时非常重要尤其是在使用并行流时。
掌握这两个特性有助于优化并行流的性能。
✅SIZED 流SIZED流指的是已知流中元素的数量的流。
简单来说创建流时如果能够提前知道流中元素的数量那么这个流就是SIZED流。
示例集合Collection所有实现了Collection接口的集合类如ArrayList、HashSet都可以创建一个 SIZED 流因为集合有一个size()方法直接可以获取元素的数量。
无法获取大小的流某些流如通过Files.lines(path)或Pattern.splitAsStream(line)创建的流不能在流创建时知道元素的数量必须通过实际处理流的数据才能获得大小因此它们不是 SIZED 流。
示例代码检查一个ArrayList是否是 SIZED 流PredicateStream?isSizedstream-((stream.spliterator().characteristics()Spliterator.SIZED)!
;ListStringstringsnewArrayList();System.out.println(ArrayList is sized? isSized.test(strings.stream()));输出ArrayListis sized?true这段代码演示了如何检查ArrayList创建的流是否具有SIZED特性。
由于ArrayList可以在创建流时知道其大小因此它是一个 SIZED 流。
✅SUBSIZED 流SUBSIZED流涉及到流在并行处理时的分割方式。
在并行流中流会被分成多个部分并分配给不同的 CPU 核心进行计算。
能够分割成相等大小子部分的流称为 SUBSIZED 流。
为什么有些流是 SUBSIZED 而有些不是ArrayListArrayList内部存储元素的数组非常适合分割可以直接将其拆分成两个大小相等的部分因此它是SIZED且SUBSIZED的流。
HashSet虽然HashSet是 SIZED 流但它的存储方式不同。
由于HashSet是通过哈希算法存储元素的无法直接知道如何将其拆分成大小相等的部分。
因此HashSet的流是 SIZED但不是 SUBSIZED 流。
示例代码检查HashSet是否是 SUBSIZED 流PredicateStream?isSubSizedstream-((stream.spliterator().characteristics()Spliterator.SUBSIZED)!
;SetStringstringsnewHashSet();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 特性。
示例映射流时保持特性StreamStringnonSubSizedStreamStream.of(apple,banana,cherry);StreamStringmappedStreamnonSubSizedStream.map(String::toUpperCase);System.out.println(Mapped stream is sized? isSized.test(mappedStream));// truenonSubSizedStreamStream.of(apple,banana,cherry);mappedStreamnonSubSizedStream.map(String::toUpperCase);System.out.println(Mapped stream is subsized? isSubSized.test(mappedStream));// true输出Mappedstream is sized?trueMappedstream is subsized?true这段代码演示了对流进行map()操作后流仍然保留了 SIZED 和 SUBSIZED 特性。
示例过滤流时丧失特性StreamStringfilteredStreamnonSubSizedStream.filter(s-s.length()
;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可以使流在并行计算时更加高效。
例如当流的子部分大小已知时流的并行执行能够更均匀地分配计算任务从而减少处理时间。
小结SIZED 流知道流中元素的数量适用于那些可以快速获取大小信息的数据源如ArrayList、HashSet。
SUBSIZED 流能够将流分割成大小相等的部分适用于那些数据结构具有明确划分和大小的流如ArrayList。
流转换某些流操作如map()和sorted()会保留 SIZED 和 SUBSIZED 特性而其他操作如filter()、flatMap()和distinct()可能会丧失这些特性。
并行流优化确保流是 SIZED 和 SUBSIZED 对于并行流的性能至关重要。
掌握这两个特性及其如何影响流的处理方式可以帮助你在 Java 流处理中更好地优化性能尤其是在并行处理时。