Beim Durchlaufen der Konvertierung primitiver Arrays in Streams stellte ich fest, dass diese char[]
nicht unterstützt werden, während andere primitive Array-Typen unterstützt werden. Gibt es einen besonderen Grund, sie im Stream auszulassen?
43
Antworten:
Wie Eran sagte, ist es nicht der einzige, der fehlt.
A
BooleanStream
wäre nutzlos, aByteStream
(falls vorhanden) kann als behandeltInputStream
oder inIntStream
(wie möglichshort
) konvertiert undfloat
alsDoubleStream
.Da
char
ohnehin nicht alle Zeichen dargestellt werden können (siehe verlinkt), wäre es ein bisschen wie ein Legacy-Stream. Obwohl die meisten Leute sowieso nicht mit Codepunkten umgehen müssen, kann es seltsam erscheinen. Ich meine, Sie verwenden,String.charAt()
ohne zu denken, "das funktioniert nicht in allen Fällen".Einige Dinge wurden ausgelassen, weil sie nicht so wichtig waren. Wie von JB Nizet in der verknüpften Frage gesagt :
Der Grund
BooleanStream
wäre nutzlos, weil Sie nur 2 Werte haben und dies die Operationen stark einschränkt. Es gibt keine mathematischen Operationen und wie oft arbeiten Sie überhaupt mit vielen booleschen Werten?quelle
BooleanStream
wäre nutzlos": warum?reduce(Boolean::logicalAnd)
oderreduce(Boolean::logicalOr)
auf einemboolean[]
? Immerhin wurden die MethodenlogicalAnd
undlogicalOr
in Java 8 hinzugefügt, damit ich diese Reduktionsoperationen von a ausführen kann.Stream<Boolean>
Übrigens können Sie über einechar[]
so einfache wieCharBuffer.wrap(array).chars()
oder streamenCharBuffer.wrap(array).codePoints()
, je nachdem, welche Semantik Sie bevorzugen.Boolean::logicalAnd
existiert, garantiert es nicht unbedingt die Existenz einesBooleanStream
. Diese können schließlich in Lambda-Situationen ohne Strom verwendet werden. Ich kann mir vorstellen , dass jemand möchte zu tunreduce(Boolean::logicalAnd)
, aber in keinem Fall hat jemand Notwendigkeit , es zu tun.while (i < limit)
, aber in keinem Fall hat jemand Notwendigkeit , es zu tun [über Zweig mit und Montageanleitung springen]“<Primitive>Stream
für jeden primitiven Typ kein Nein gibt, ist, dass die API dadurch zu stark aufgebläht wird. Die richtige Frage lautet: "Warum gibt esIntStream
überhaupt?" und die unglückliche Antwort ist, dass das Typensystem von Java nicht ausreichend ausgearbeitet ist, um esStream<int>
ohne den gesamten Leistungsaufwand der Verwendung auszudrückenInteger
. Wenn Java Werttypen hätte, die auf dem Stapel zugewiesen oder direkt in andere Datenstrukturen eingebettet werden könnten, wäre nichts anderes erforderlichStream<T>
Die Antwort lautet natürlich " weil die Designer das entschieden haben ". Es gibt keinen technischen Grund, warum
CharStream
es nicht existieren könnte.Wenn Sie eine Begründung wünschen, müssen Sie normalerweise die OpenJDK-Mailingliste * aktivieren. Die Dokumentation des JDK hat nicht die Gewohnheit zu rechtfertigen, warum irgendetwas der Grund ist, warum es ist.
Jemand fragte
Die Antwort von Brian Goetz (Java Language Architect) lautet
Quelle
Das sagt er auch anderswo
Quelle
TL; DR: Die Wartungskosten sind es nicht wert.
* Falls Sie neugierig sind, war die von mir verwendete Google-Abfrage
quelle
100K+ of JDK footprint
?Es werden nicht nur
char
Arrays nicht unterstützt.Es gibt nur drei Arten von primitiven Strömen -
IntStream
,LongStream
undDoubleStream
.Als Ergebnis
Arrays
hat Methoden, die konvertierenint[]
,long[]
unddouble[]
in die entsprechenden primitiven Streams.Es gibt keine entsprechenden Methoden für
boolean[]
,byte[]
,short[]
,char[]
undfloat[]
, da diese primitiven Typen haben keine primitive Strömen entsprechen.quelle
char
ist ein abhängiger Teil vonString
- Speichern von UTF-16-Werten. Ein Unicode-Symbol, ein Codepunkt , ist manchmal ein Ersatzzeichenpaar. Daher deckt jede einfache Lösung mit Zeichen nur einen Teil der Unicode-Domäne ab.Es gab eine Zeit,
char
die ihr eigenes Recht hatte, ein öffentlicher Typ zu sein. Aber heutzutage ist es besser , verwenden Codepunkte einIntStream
. Ein Saiblingstrom konnte Ersatzpaare nicht einfach handhaben.Der andere prosaischere Grund ist, dass das JVM- "Prozessor" -Modell ein
int
so kleinstes "Register" verwendet, dass Boolesche Werte, Bytes, Kurzschlüsse und auch Zeichen an einem Speicherort mit einer solchen Größe gespeichert werden. Um Java-Klassen nicht unbedingt aufzublähen, verzichtete man auf alle möglichen Kopiervarianten.In ferner Zukunft könnte man erwarten, dass primitive Typen als generische Typparameter fungieren dürfen, sofern a
List<int>
. Dann könnten wir eine sehenStream<char>
.Vermeiden Sie es im Moment besser
char
und verwenden Sie es möglicherweisejava.text.Normalizer
für eine eindeutige kanonische Form von Codepunkten / Unicode-Zeichenfolgen.quelle