2017-09-12 1 views
7

Wie in this question diskutiert, ist die Implementierung von distinct() in der Lage, einen effizienteren Algorithmus zu verwenden, wenn der Stream, auf dem er ausgeführt wird, bekannt ist, dass die Laufzeit sortiert wird. Wie können wir ein ähnliches Ergebnis erzielen, wenn wir wissen, dass der Stream sortiert ist (z. B. weil er aus einer extern vorsortierten Datenquelle stammt, z. B. eine SQL-Abfrage mit einer order by-Klausel), aber nicht als solcher gekennzeichnet ist? Es gibt eine unordered() Operation, die die Ordering-Flags entfernt, aber soweit ich sehen kann, gibt es keine Möglichkeit, dem System mitzuteilen, dass die Daten extern bestellt wurden.Java Streams: distinct() auf einem vorsortierten Stream?

Antwort

3

Sie könnten Ihren spliterator um eine bestehende Sammlung zum Beispiel erstellen:

List<Integer> list = Arrays.asList(1, 2, 3, 4); 

    Spliterator<Integer> sp = Spliterators.spliterator(list, Spliterator.SORTED); 

    System.out.println(sp.hasCharacteristics(Spliterator.SORTED)); // true 
+0

Die Ströme Ich verwende werden von einer Dritten Bibliothek erzeugt, so dass ich nicht schaffen spliterators mich alle an. Ich glaube, ich könnte * eine Art Proxy-Spliterator verwenden, der funktionieren könnte. – Jules

+0

Ja, ein Wrapping-Spliterator, der verschiedene Eigenschaften meldet, scheint die einzige Lösung zu sein. – Holger

Verwandte Themen