如何检查Java流是否已订购?

时间:2020-01-30 08:49:20

标签: java java-stream

是否可以检查Java Stream是否已订购?

我所说的Stream是无序的,例如,在其上调用了unordered()的流。

1 个答案:

答案 0 :(得分:4)

要检查流是否无序,您需要获取流的分离器的特性,并将test的第3位设置为1。

您可以使用以下代码段作为示例:

    Stream<Integer> sorted = Stream.of(1, 2, 3).sorted();
    System.out.println((sorted.spliterator().hasCharacteristics(Spliterator.SORTED));

    sorted = Stream.of(1, 2, 3).sorted().unordered();
    System.out.println((sorted.spliterator().hasCharacteristics(Spliterator.SORTED));

    Stream<Integer> unordered = Stream.of(1, 2, 3).unordered();
    System.out.println((unordered.spliterator().hasCharacteristics(Spliterator.SORTED));

    unordered = Stream.of(1, 2, 3);
    System.out.println((unordered.spliterator().hasCharacteristics(Spliterator.SORTED));

有关更多详细信息,请检查Spliterator documentation

更新: 但是spliterator()的调用是流上的终端操作,这意味着无法对其执行更多操作。尽管这些元素也不会被消耗,但仍可以通过以下方式创建具有相同特征的新流:

    Spliterator<Integer> spliterator = unordered.spliterator();
    System.out.println(spliterator.hasCharacteristics(Spliterator.SORTED));
    Stream<Integer> newStream = StreamSupport.stream(spliterator, unordered.isParallel())
                                             .onClose(unordered::close); // in case if you have some close handlers on initial stream

感谢@Holger指出了最后一刻。