Nach dem doc von Spliterator#getComparator
wirft, heißt esgibt es den spliterator aus einem sortierten Strom eine Ausnahme
Wenn dieser Spliterator der Quelle
SORTED
durch einComparator
ist, kehrt dieComparator
. Wenn die QuelleSORTED
in natürlicher Reihenfolge ist, wird null zurückgegeben. Andernfalls, wenn die Quelle nichtSORTED
ist, wirdIllegalStateException
ausgelöst. AnforderungenUmsetzung:
Die Standardimplementierung immer wirft
IllegalStateException
.Rückgabe: a
Comparator
odernull
wenn die Elemente in der natürlichen Reihenfolge sortiert sind.Wirf:
IllegalStateException
- wenn der Spliterator keine Eigenschaft vonSORTED
meldet.
Also, wenn Sie dieses Stück Code ausgeführt
Spliterator<Integer> spliterator = Stream.of(1, 2, 3).sorted().spliterator();
System.out.println((spliterator.characteristics() & Spliterator.SORTED) == Spliterator.SORTED);
System.out.println(spliterator.getComparator());
ich:
true
null
So weit so gut. Nun, wenn dies zu tun:
Spliterator<Integer> spliterator = Stream.of(1, 2, 3).sorted(Comparator.naturalOrder()).spliterator();
System.out.println((spliterator.characteristics() & Spliterator.SORTED) == Spliterator.SORTED);
System.out.println(spliterator.getComparator());
Es gibt false
und löst eine Ausnahme:
Exception in thread "main" java.lang.IllegalStateException
at java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.getComparator(StreamSpliterators.java:259)
at SpliteratorTest.main(SpliteratorTest.java:10)
Warum ist es falsch ausgibt und löst eine Ausnahme?
Sollte es mir nicht die Comparator
geben, die ich sorted()
gemäß der Dokumentation lieferte?
(Dies geschieht auch mitoder comparing(identity())
, usw.).
Übrigens können Sie 'spliterator.hasCharacteristics (Spliterator.SORTED)' – Holger
verwenden Ich fand eine [verwandte Diskussion] (http://mail.openjdk.java.net/pipermail/core-libs-dev/2014 (Juni/027421.html) in den Mail-Archiven, aber ich bin nicht von [Paul Santoz 'Antwort] überzeugt (http://mail.openjdk.java.net/pipermail/core-libs-dev/2014-June/027423) .html). Warum würde ein Stream aus einem 'TreeSet' mit einem benutzerdefinierten Komparator' SORTED' sein und ein Stream, der mit demselben benutzerdefinierten Vergleicher sortiert ist, nicht? –
@Didier L: Das ist in der Tat nicht überzeugend. Vor allem das "wir wissen nicht, ob zwei Komparatoren in ihrem Verhalten identisch sind" -Teil. Natürlich könnte es zwei verschiedene Komparatoren geben, die das gleiche Verhalten zeigen, ohne eine Möglichkeit, sie zu erkennen, aber das ist kein Grund, die Tatsache zu ignorieren, dass zwei identische Komparatoren natürlich das gleiche Verhalten zeigen. Insbesondere, da beide, Comparator.naturalOrder() = Comparator.naturalOrder() und Comparator.reverseOrder() = Comparator.reverseOrder(), zu "true" auswerten. – Holger