Unter Java 8 können wir sie wie folgt lösen:
String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
str.codePoints().forEachOrdered(i -> System.out.print((char)i));
Die Methode chars() gibt eine IntStream
wie erwähnt in doc :
Liefert einen Stream von int zero-extending der char-Werte aus dieser Sequenz. Jedes Zeichen, das auf einen Surrogatcodepunkt abgebildet wird, wird uninterpretiert durchgereicht. Wenn die Sequenz verändert wird, während der Strom gelesen wird gelesen wird, ist das Ergebnis undefiniert.
Die Methode codePoints()
gibt auch eine IntStream
laut Dok:
Gibt einen Strom von Codepunktwerten aus dieser Sequenz zurück. Alle Surrogatpaare, die in der Sequenz angetroffen werden, werden kombiniert, als ob durch Character.toCodePoint kombiniert und das Ergebnis wird an den Stream übergeben. Jede andere Codeeinheiten, einschließlich gewöhnlicher BMP-Zeichen, ungepaarter Surrogate und undefinierte Codeeinheiten, werden zu int-Werten null-erweitert erweitert, die dann an den Stream weitergegeben werden.
Was ist der Unterschied zwischen Zeichen und Codepunkt? Wie bereits in este Artikel:
Mit Unicode 3.1 wurden zusätzliche Zeichen hinzugefügt, so dass die Gesamtzahl der Zeichen auf mehr als die 2^16 = 65536 Zeichen, die mit einem durch ein einziges 16-Bit-Zeichen unterschieden char
. Daher ist eine char
Wert nicht hat keine Eins-zu-Eins-Zuordnung mehr zur grundlegenden semantischen Einheit in Unicode. JDK 5 wurde aktualisiert, um den größeren Satz von Zeichenwerten Werte zu unterstützen. Anstelle einer Änderung der Definition des char
Typ, einige der die neuen zusätzlichen Zeichen werden durch ein Surrogatpaar dargestellt aus zwei char
Werte. Um Verwirrung bei der Namensgebung zu vermeiden, wird ein Codepunkt die Nummer verwendet, die ein bestimmtes Unicode-Zeichen repräsentiert Zeichen repräsentiert, einschließlich zusätzlicher Zeichen.
Und warum forEachOrdered
und nicht forEach
?
Das Verhalten von forEach
explizit nicht-deterministisch ist, während die forEachOrdered
führt für jedes Element dieses Streams eine Aktion durch, und zwar in der Begegnungsreihenfolge des Stroms wenn der Stream eine bestimmte Reihenfolge der Begegnungen hat. Also forEach
garantiert nicht, dass der Auftrag ausgeführt wird. Prüfen Sie auch dies Frage für mehr.
Für Unterschied zwischen einem Zeichen, einem Codepunkt, einer Glyphe und einem Graphem これを確認する Frage .