3

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.SORTEDfalse这种情况下?流使用自定义比较器进行排序:.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 个中间操作:两个sortedfilter. 在线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,但这似乎仍然很奇怪且不合逻辑。

4

0 回答 0