Spliterator SORTED特征行为

时间:2018-06-01 11:24:19

标签: java sorting java-stream spliterator

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时 - >即使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,但这看起来仍然很奇怪而且不合逻辑。

0 个答案:

没有答案