Di solito è più sicuro da usare flusso di punti di codice che è IntStream
:
IntStream codePoints = string.codePoints();
In questo modo Unicode coppie di surrogati saranno fuse in un'unica codepoint, in modo da avere risultati corretti con tutti i simboli Unicode . Esempio di utilizzo:
String result = string.codePoints().map(Character::toUpperCase)
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
.toString();
Si noti inoltre che si evita la boxe, quindi potrebbe essere ancora più efficace di elaborazione Stream<Character>
.
Un altro modo per raccogliere tale flusso è quello di utilizzare separata StringBuilder
:
StringBuilder sb = new StringBuilder();
String result = string.codePoints().map(Character::toUpperCase)
.forEachOrdered(sb::appendCodePoint);
Mentre tale approccio sembra meno funzionale, può essere più efficace se si dispone già di un StringBuilder
o desidera concatenare qualcosa di più in seguito alla stessa stringa.
fonte
2015-09-09 06:56:40
Si noti che questa soluzione non funziona se la stringa contiene caratteri Unicode che non si adattano a un carattere Java. Questo è il caso, ad esempio, di alcune lingue arcane e di emoticon. Vedi [Risposta di Tagir] (https://stackoverflow.com/a/32472793/452775) per una soluzione che gestisca ciò. – Lii