Spliterator接口定义了许多特征:
Spliterator还会报告ORDERED,DISTINCT,SORTED,SIZED,NONNULL,IMMUTABLE,CONCURRENT和SUBSIZED中的结构,源和元素的一组特征()。
我们来看看Sliterator#SORTED
表示遇到订单遵循已定义的排序顺序的特征值。
现在让我们看看一些例子:
List.of(1,2,3,4,5).stream().spliterator().hasCharacteristics(Spliterator.SORTED)
$1 ==> false
流未排序,因此Spliterator.SORTED
应为false
。
让我们对流进行排序:
List.of(1,2,3,4,5).stream().sorted().spliterator()
.hasCharacteristics(Spliterator.SORTED)
$2 ==> true
对流进行排序,Spliterator.SORTED
应为true
,此处不出意外。
让我们最后对流进行排序,但使用自定义Comparator
。
List.of(1,2,3,4,5).stream().sorted((a,b) -> a.compareTo(b))
.spliterator().hasCharacteristics(Spliterator.SORTED)
$3 ==> false
我完全迷失在这里。在这种情况下,为什么Spliterator.SORTED
为false
?该流按自定义比较器排序:.sorted((a,b) -> a.compareTo(b))
,但SORTED
标志为false
。这对我来说似乎不合逻辑。
让我们想象以下情况:
List.of(1,2,3,4).stream()
1: .sorted() // SORTED flag is set to true
2: .filter(i -> i % 2 == 0) // Operation which doesn't reset SORTED
3: .sorted() // can be ignored
4: .forEach(System.out::println)
流管道中有3个中间操作:两个sorted
和filter
。在线1:
对流进行排序,在2:
行上对流进行过滤,Spliterator.SORTED
仍为true
。这意味着可以忽略行sorted
上的3:
操作(已在行1
上排序,SORTED
标志为真。
然而,当使用带有比较器的sorted
时 - >即使compatator相同,也会执行对
List.of(1,2,3,4).stream()
.sorted(Comparator.reverseOrder()) // SORTED flag is not affected
.filter(i -> i % 2 == 0)
.sorted(Comparator.reverseOrder()) // will be sorted one more time
.forEach(System.out::println)
可能是我误解了javadocs,但这看起来仍然很奇怪而且不合逻辑。