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 CharStreamvernü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 IntStreamund ordne sie über das Lambda einem Objekt zu. Dadurch i -> (char)iwird 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 mapnichts 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 IntStreamDatei 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 CharStreamsoll. 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 IntStreamzu arbeiten, um ordnungsgemäß mit ihnen arbeiten zu können.
CharStreames nicht existiert, was wäre das Problem, um es hinzuzufügen?