2015-04-01 5 views
5

Die javadoc of Spliterator (die im Grunde ist das, was wirklich hinter ist ein Stream wenn ich die Dinge richtig verstehe) definiert viel Eignung: der Sinn wie SIZED machen, CONCURRENT, IMMUTABLE usw.Warum definiert der Spliterator <?> NONNULL als Merkmal?

Aber es definiert auch NONNULL; Warum?

Ich hätte aber, dass es die Verantwortung des Benutzers wäre sicherzustellen, dass und wenn zum Beispiel ein Entwickler .sort() einen nicht SORTED Stream versucht, wo es null Elemente gibt, würde er/sie rechtmäßig mit einer NPE begrüßt werden ...

Aber dann existiert diese Eigenschaft. Warum? Die javadoc von Spliterator selbst erwähnt keine wirkliche Verwendung davon, und auch nicht die package-info.java des java.util.stream Pakets ...

Antwort

3

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 nullenthalten 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.

+0

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

+1

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

+0

Ja, ich stimme zu, es ist ein starker Punkt; Ich schätze, ich weiß einfach nicht genug über die Design-Entscheidungen dahinter: / – fge

0

ich folgende Anmerkungen im Code für die ENUM StreamOpFlag gefunden.

// The following Spliterator characteristics are not currently used but a 
// gap in the bit set is deliberately retained to enable corresponding 
// stream flags if//when required without modification to other flag values. 
// 
// 4, 0x00000100 NONNULL(4, ... 
// 5, 0x00000400 IMMUTABLE(5, ... 
// 6, 0x00001000 CONCURRENT(6, ... 
// 7, 0x00004000 SUBSIZED(7, ... 
+0

Äh, sogar 'IMMUTABLE' und' CONCURRENT'? Wie wird dann die Parallelisierung entschieden? Je mehr es geht, desto mehr bin ich verwirrt:/ – fge

Verwandte Themen