Java Stream API 排序流特性与用法
在 Java 中,SORTED 流表示元素已经按某种规则排序。这些流可以通过两种方式创建:
- 排序的源:例如
TreeSet,它自然保持元素的顺序。 - 调用
sorted()方法:该方法可以将流中的元素按自然顺序或自定义的比较器进行排序。
知道流是已排序的,可以帮助流的实现做一些优化。例如,当流已经是排序好的时,流的实现可以跳过再次排序的步骤,从而提高效率。然而,流的排序特性并非在所有情况下都能被优化。因为有时候,如果使用不同的比较器对流进行排序,排序特性可能会丧失。
SORTED 特性的清除
某些中间操作会移除流的 SORTED 特性。例如,当你使用 map() 或 flatMap() 等操作时,即使流之前是排序过的,结果流将不再被视为 SORTED 流。
示例:检查流的排序特性
你可以通过 Spliterator 接口中的 characteristics() 方法来检查流是否具有 SORTED 特性。下面是一个简单的例子,展示如何检查流的排序特性:
Predicate<Stream<?>> isSorted = stream -> ((stream.spliterator().characteristics() & Spliterator.SORTED) != 0);
List<String> strings = List.of("one", "two", "two", "three", "four", "five");
System.out.println("Is strings sorted? " + isSorted.test(strings.stream())); // false
Stream<String> sortedStrings = strings.stream().sorted();
System.out.println("Is sortedStrings sorted? " + isSorted.test(sortedStrings)); // true
Stream<String> filtered = strings.stream().sorted().filter(s -> s.length() < 5);
System.out.println("Is filtered sorted? " + isSorted.test(filtered)); // true
Stream<Integer> lengths = strings.stream().sorted().filter(s -> s.length() < 5).map(String::length);
System.out.println("Is lengths sorted? " + isSorted.test(lengths)); // false
解释
strings.stream()返回的流没有排序,所以isSorted.test(strings.stream())返回false。sortedStrings是通过调用sorted()创建的流,它是有序的,因此isSorted.test(sortedStrings)返回 。


