Wie bereits erwähnt, bestand die Entwurfsentscheidung dahinter darin, die Explosion von Methoden und Klassen zu verhindern.
Persönlich denke ich jedoch, dass dies eine sehr schlechte Entscheidung war, und es sollte, da sie keine CharStream
vernünftigen, anderen Methoden treffen wollen chars()
, als ich denken würde:
Stream<Character> chars()
, das gibt einen Strom von Box-Zeichen, die einige leichte Leistungseinbußen haben.
IntStream unboxedChars()
, die für den Leistungscode verwendet werden würde.
Jedoch , anstatt sich auf , warum es auf diese Weise zur Zeit geschehen ist, ich glaube , diese Antwort auf zeigt eine Art und Weise konzentrieren sollte es mit der API zu tun , dass wir mit Java 8 bekommen haben.
In Java 7 hätte ich es so gemacht:
for (int i = 0; i < hello.length(); i++) {
System.out.println(hello.charAt(i));
}
Und ich denke, eine vernünftige Methode, dies in Java 8 zu tun, ist die folgende:
hello.chars()
.mapToObj(i -> (char)i)
.forEach(System.out::println);
Hier erhalte ich eine IntStream
und ordne sie über das Lambda einem Objekt zu. Dadurch i -> (char)i
wird sie automatisch in eine Box verpackt. Stream<Character>
Dann können wir tun, was wir wollen, und weiterhin Methodenreferenzen als Plus verwenden.
Sei dir aber bewusst, dass du jedoch mapToObj
, dass Sie map
nichts tun müssen , wenn Sie vergessen und verwenden , dann wird sich nichts beschweren, aber Sie werden trotzdem mit einem enden IntStream
, und Sie werden sich möglicherweise nicht mehr fragen, warum die ganzzahligen Werte anstelle der Zeichenfolgen gedruckt werden, die die Zeichen darstellen.
Andere hässliche Alternativen für Java 8:
Wenn Sie in einer IntStream
Datei bleiben und diese letztendlich drucken möchten, können Sie keine Methodenreferenzen mehr zum Drucken verwenden:
hello.chars()
.forEach(i -> System.out.println((char)i));
Darüber hinaus funktioniert die Verwendung von Methodenreferenzen auf Ihre eigene Methode nicht mehr! Folgendes berücksichtigen:
private void print(char c) {
System.out.println(c);
}
und dann
hello.chars()
.forEach(this::print);
Dies führt zu einem Kompilierungsfehler, da möglicherweise eine verlustbehaftete Konvertierung vorliegt.
Fazit:
Die API wurde auf diese Weise entwickelt, weil sie nicht hinzugefügt werden CharStream
soll. Ich persönlich denke, dass die Methode a zurückgeben sollte Stream<Character>
, und die Problemumgehung besteht derzeit darin, mapToObj(i -> (char)i)
auf a IntStream
zu arbeiten, um ordnungsgemäß mit ihnen arbeiten zu können.
CharStream
es nicht existiert, was wäre das Problem, um es hinzuzufügen?