Manchmal möchte ich etwas Einfaches mit jedem Zeichen in einer Zeichenkette machen. Da eine Zeichenkette unveränderlich ist, gibt es leider keine gute Möglichkeit dies zu tun, außer das Durchlaufen der Zeichenkette, die ziemlich ausführlich sein kann. Wenn Sie stattdessen einen Stream verwenden würden, könnte es viel kürzer sein, in nur ein oder zwei Zeilen.
Gibt es eine Möglichkeit, ein String
in ein Stream<Character>
zu konvertieren?
Sie können die Methode chars()
verwenden, die in CharSequence
bereitgestellt wird, und da String
class diese Schnittstelle implementiert, können Sie darauf zugreifen.
Die Methode chars()
gibt IntStream
zurück, also müssen Sie sie in (char)
umwandeln, wenn Sie IntStream
in Stream<Character>
z. B.
%Vor% Es ist normalerweise sicherer, einen Stream von Codepunkten zu verwenden, der IntStream
:
Auf diese Weise werden Unicode-Ersatzpaare zu einem einzigen Codepunkt zusammengeführt, sodass Sie mit allen Unicode-Symbolen korrekte Ergebnisse erhalten. Beispielverwendung:
%Vor% Beachten Sie auch, dass Sie das Boxen vermeiden, daher ist es möglicherweise effektiver als die Verarbeitung von Stream<Character>
.
Eine andere Möglichkeit, einen solchen Stream zu sammeln, ist die separate Verwendung von StringBuilder
:
Obwohl ein solcher Ansatz weniger funktional aussieht, ist es möglicherweise effizienter, wenn Sie bereits ein StringBuilder
haben oder später etwas mehr zu demselben String verketten möchten.
Sie können chars
method verwenden, das IntStream
zurückgibt, und indem Sie es auf char
mappen, erhalten Sie Stream<Character>
. mapToObj
gibt Object
valued Stream
in unserem Fall Stream
von Character
zurück, weil wir int
auf char
und java Auto Boxed auf Character
zugeordnet haben intern .
Außerdem kann man es mit Hilfe von Guava ( com.google.common.collect.Lists
) so verwenden, die eine unveränderliche Liste von Character
von String
zurückgibt.
Tags und Links string java java-8 java-stream