核心内容摘要
8x8x永久免费视频
文章目录
Java Stream API - 流特性✅ 什么是 Stream 的特性 特性概述⚠️ 其他特性✅ 如何检查 Stream 的特性输出解释✅ 详细介绍每个流特性 **ORDERED有序**示例判断流是否为有序流输出移除顺序特性输出 **DISTINCT去重**示例检查流的去重特性输出 **NONNULL无 null 元素**示例检查流是否包含 null 元素输出 **SORTED已排序**示例检查流是否已排序输出 **SIZED已知大小**✅
总结
Java Stream API - 流特性在 Java Stream API 中每个流Stream都具有一些特性这些特性定义了流如何处理数据以及这些数据是否具有某些特定的属性。
这些特性对编写高效的流管道非常重要尤其是在使用并行流时。
✅ 什么是 Stream 的特性Stream API 使用一个特殊的对象——Spliterator来描述流的特性。
Spliterator 接口的名字来源于它在流处理中的作用它的功能类似于迭代器Iterator在集合Collection中的作用。
此外Spliterator 还控制并行流如何将元素分配到不同的 CPU 上进行处理。
特性概述ORDERED流中的元素处理顺序是有意义的。
DISTINCT流中的元素没有重复项。
NONNULL流中的元素没有null值。
SORTED流中的元素是排序的。
SIZED流处理的元素数量是已知的。
SUBSIZED分割该流时得到的子流也是 SIZED 的。
⚠️ 其他特性IMMUTABLE和CONCURRENT特性在此教程中未涉及。
流的特性由流的来源、所执行的操作以及该流是如何创建的来决定。
理解这些特性有助于我们在开发中做出更加高效和有针对性的优化。
✅ 如何检查 Stream 的特性如果你想检查一个流是否具备某种特性可以通过Spliterator的characteristics()方法来实现。
该方法返回一个包含多个标志位的整数每个标志位代表流的不同特性。
例如我们可以编写一个判断流是否具备ORDERED特性的谓词PredicatePredicateStream?isOrderedstream-((stream.spliterator().characteristics()Spliterator.ORDERED)!
;StreamIntegerstreamList.of(1,2,
.stream();booleanorderedisOrdered.test(stream);System.out.println(ordered ordered);输出orderedtrue解释这段代码通过spliterator()方法获取流的Spliterator然后使用位运算来判断该流是否具有ORDERED特性。
如果流的来源是List那么它默认是有序的因此ORDERED特性会被设置为true。
如果你将List替换为Set你会发现ORDERED特性不再存在因为Set中的元素顺序是不可预测的。
✅ 详细介绍每个流特性ORDERED有序如果流是从有序的数据源创建的那么它就是有序流。
例如List接口的实例以及Files.lines(path)和Pattern.splitAsStream(string)等方法都会产生有序流。
对于有序流元素的顺序是非常重要的。
然而在并行流中保留元素顺序可能会带来性能开销。
若你不关心顺序可以通过unordered()中间操作移除流的ORDERED特性。
示例判断流是否为有序流StreamStringorderedStreamList.of(apple,banana,cherry).stream();booleanisOrderedisOrdered.test(orderedStream);System.out.println(Is ordered: isOrdered);输出Isordered:true对于List流默认是有序的因此返回true。
移除顺序特性StreamStringunorderedStreamorderedStream.unordered();booleanisOrderedAfterUnorderedisOrdered.test(unorderedStream);System.out.println(Is ordered after unordered: isOrderedAfterUnordered);输出Isordered after unordered:false通过unordered()操作我们可以将有序流转换为无序流进而移除ORDERED特性。
DISTINCT去重流中的元素是去重的意味着没有重复的元素。
如果流的元素可以被去重那么该流具有DISTINCT特性。
例如Stream.of(1, 2, 2,
会返回一个不包含重复项的流。
示例检查流的去重特性StreamIntegerdistinctStreamStream.of(1,2,2,
.distinct();booleanisDistinctdistinctStream.allMatch(newHashSet()::add);System.out.println(Is distinct: isDistinct);输出Isdistinct:trueNONNULL无 null 元素如果流中的元素不包含null那么该流具有NONNULL特性。
Stream.of(1, 2,
就是一个没有null元素的流。
示例检查流是否包含 null 元素StreamStringnonNullStreamStream.of(apple,banana,cherry);booleanhasNullnonNullStream.anyMatch(Objects::isNull);System.out.println(Contains null: hasNull);输出Containsnull:falseSORTED已排序如果流的元素是有序的那么该流具有SORTED特性。
这意味着流中的元素是按照某种规则排序的例如按升序或降序排列。
示例检查流是否已排序StreamIntegersortedStreamStream.of(3,1,
.sorted();booleanisSortedsortedStream.isOrdered();System.out.println(Is sorted: isSorted);输出Issorted:trueSIZED已知大小如果流的大小是已知的即流处理的元素数量是确定的那么该流具有SIZED特性。
比如List和Set流都是有大小的。
✅
总结了解和利用流的特性可以帮助我们在编写高效的流管道时做出更好的决策。
例如知道一个流是否是有序的可以让我们在并行流处理中避免不必要的性能开销。
如果你不关心元素的顺序使用unordered()可以显著提高并行流的性能。
通过Spliterator获取流的特性我们可以为流操作添加更细粒度的优化尤其是在处理大量数据时能让程序运行更加高效。