Aus der Dokumentation von Spliterator
:
A Spliterator auch eine Reihe von characteristics()
seiner Struktur CONCURRENT
, Quelle und Elemente aus den Reihen ORDERED
, DISTINCT
, SORTED
, SIZED
, NONNULL
, IMMUTABLE
, berichtet und SUBSIZED
. Diese können von Spliterator-Clients verwendet werden, um die Berechnung zu steuern, zu spezialisieren oder zu vereinfachen.
Beachten Sie, dass es funktioniert nicht die Prävention von NullPointerException
s erwähnen. Wenn Sie eine Stream
sortieren, die null
Werte enthalten könnte, ist Ihre Verantwortung, eine Comparator
bereitzustellen, die null
s verarbeiten kann. Der zweite Satz macht auch deutlich, dass die Verwendung dieser Flags nur eine Option ist, keine Voraussetzung für "Spliterator-Clients", die nicht auf die Verwendung von Stream
s beschränkt ist.
Also unabhängig davon, ob es durch die aktuelle Umsetzung des Stream
API verwendet wird, gibt es Möglichkeiten, die Vorteile des Wissens über eine NONULL
Charakteristik zu gewinnen?
Ich denke schon. Eine Implementierung kann zu einem spezialisierten Code für einen Nicht--Spliterator
verzweigen, um null
zum Darstellen eines bestimmten Zustands dann z. Abwesende Werte oder der Anfangswert vor der Verarbeitung des ersten Elements, etc. Wenn Tatsache ist, ist der tatsächliche Implementierungscode zum Behandeln von Stream
s, der null
enthalten kann, kompliziert. Aber natürlich müssen Sie immer abwägen, ob die Vereinfachung eines Falles die Code-Duplizierung rechtfertigt.
Aber manchmal ist die Vereinfachung ist so einfach wie zu wissen, dass es keine null
Werte bedeuten, dass Sie eine der Concurrent…
Sammlungen verwenden können, die null
s nicht zulassen, intern.
Hmmwait ... Sind 'Stream' die Hauptkunden hier? Ich bin wahrscheinlich zu engstirnig, aber ich sehe nicht, welche anderen Kunden Sie möglicherweise entwickeln könnten. Sicher, Sie können Ihre eigenen implementieren (ich tat das), aber anders als in einem Stream verwenden ... – fge
Ist nicht "Sie können Ihre eigenen implementieren" ein starker Punkt, wenn nicht * der * Punkt des Java API, die Sie dabei unterstützt, Ihre eigene Anwendung zu schreiben, anstatt vollständige Anwendungen bereitzustellen? Außerdem sind 'Streams' die Hauptkunden, ja, aber das beschränkt sich nicht auf die * aktuelle Implementierung * von 'Streams'. Das Hinzufügen eines neuen Merkmals in einer zukünftigen Version würde eine Hauptversion erfordern, aber das Hinzufügen einer Implementierung, die eine bereits existierende Markierung (besser) verwendet, kann in jedem kleinen Update vorkommen. Es ist also eine vernünftige Strategie, Flags mit einem möglichen Wert so früh wie möglich hinzuzufügen. – Holger
Ja, ich stimme zu, es ist ein starker Punkt; Ich schätze, ich weiß einfach nicht genug über die Design-Entscheidungen dahinter: / – fge