Хотя характеристики Spliterator
могут отражать текущее содержимое коллекции, они обычно зависят от типа только исходной коллекции. Таким образом, все стандартные реализации List
никогда не сообщают о SORTED
характеристиках c, даже когда их элементы в настоящее время сортируются, тогда как все реализации SortedSet
всегда сообщают о SORTED
характеристиках c.
* 1009. * Вам редко может понадобиться использовать этот метод самостоятельно. API обработки данных, такие как
Stream
API, могут использовать характеристики за сценой для оптимизации выполнения. Например, операция
sorted
для
Stream
может быть пропущена при обнаружении того, что данные уже отсортированы. Но если назвать менее очевидный пример,
distinct
может работать по-разному, когда данные сортируются по естественному порядку типа элемента.
Кроме того, состояние конвейера потока может служить примером случая, когда характеристики не определяются типом:
public static void main(String[] args) {
check(Stream.of("foo", "bar").filter(x -> true));
check(Stream.of("foo", "bar").sorted().filter(x -> true));
}
private static void check(Stream<?> s) {
System.out.println("Type: "+s.getClass());
System.out.println("sorted: "+s.spliterator().hasCharacteristics(Spliterator.SORTED));
System.out.println();
}
Type: class java.util.stream.ReferencePipeline$2
sorted: false
Type: class java.util.stream.ReferencePipeline$2
sorted: true
Обычно этот API нельзя использовать для получения компаратора созданной вами коллекции, поскольку вы уже знаете компаратор. Но есть случаи, когда в сплитераторе есть компаратор, не исходящий из вашего кода (напрямую):
TreeMap<String, Integer> map = new TreeMap<>(Comparator.comparingInt(String::length));
Spliterator<Map.Entry<String, Integer>> sp = map.entrySet().spliterator();
if(sp.hasCharacteristics(Spliterator.SORTED)) {
Comparator<? super Map.Entry<String, Integer>> comparator = sp.getComparator();
System.out.println("Entry comparator: " + comparator);
Map.Entry<String, Integer> e1 = new AbstractMap.SimpleEntry<>("some", 5);
Map.Entry<String, Integer> e2 = new AbstractMap.SimpleEntry<>("string", 3);
System.out.println(BinaryOperator.maxBy(comparator).apply(e1, e2));
}