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
使用 with 比较器时 ->即使 compatator 相同,也会执行对 sorted 的每次调用:
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,但这似乎仍然很奇怪且不合逻辑。