2015-07-22 1 views
14

Von einem Char-Array, möchte ich einen Stream erstellen, um Java 8 Features wie Filter und Karten zu verwenden.Willst du einen Strom von Zeichen aus Char-Array in Java erstellen

char[] list = {'a','c','e'}; 
Stream<Character> cStream = Stream.of(list); 
// Stream<Character> cStream = Arrays.stream(list); 

Die erste Methode funktioniert nicht (Grund: Änderung CStream zu Stream<char[]>). Die kommentierte Zeile funktioniert nicht (Grund: Die Methode stream(T[]) im Typ Arrays ist für die Argumente nicht anwendbar (char[])).

Ich weiß, dass, wenn char[] list zu int[] geändert wird, alles funktioniert mit IntStream. Aber ich möchte nicht alle char[] zu int[] jedes Mal konvertieren oder in eine Liste ändern, wenn ich Stream-Bibliothek auf char Array verwenden muss.

+0

möglich Duplikat von [Warum ist String.chars() ein Strom von Ints in Java 8?] (Http://stackoverflow.com/questions/22435833/why-is-string-chars-a-stream-of- ints-in-java-8) – heenenee

+0

@heenenee Das ist sicherlich verwandt, aber ich würde es nicht ein Duplikat nennen. – Jeffrey

+0

Obwohl die andere Frage auf warum konzentriert ist, wird das wie in seiner akzeptierten Antwort erklärt. Eine einzige Google-Suche würde dies ergeben, und ich denke, ich gehe durch http://meta.stackoverflow.com/a/261593/2646526 – heenenee

Antwort

0

Die einfachste Änderung, die Sie am Code vornehmen können, ist die Änderung char[] zu Character[].

Eine andere Möglichkeit ist es, eine neue Arraylist der boxed char s zu erstellen:

char[] list = {'a','c','e'}; 
List<Character> listArray = new ArrayList<>(); 
for (char c : list) 
    listArray.add(c); 
Stream<Character> cStream = listArray.stream(); 

Darüber hinaus können Sie Google Guava der Chars-Klasse verwenden, ersetzen die for Schleife mit:

List<Character> listArray = Chars.asList(list); 
19

Sie können einen IntStream verwenden, um die Indizes zu generieren, gefolgt von :

char[] arr = {'a','c','e'}; 
Stream<Character> cStream = IntStream.range(0, arr.length).mapToObj(i -> arr[i]); 
6

Eine kurze und effiziente Art und Weise eine IntStream von char[] Array zu erstellen ist java.nio.CharBuffer zu verwenden:

char[] list = {'a','c','e'}; 
IntStream stream = CharBuffer.wrap(list).chars(); 

diese Weise erhalten Sie eine IntStream Interpretation der int-Werte als Zeichen verwenden können. Wenn Sie eine Box Stream<Character> wollen (was weniger effizient sein kann), verwenden

Stream<Character> stream = CharBuffer.wrap(list).chars().mapToObj(ch -> (char)ch); 

CharBuffer Verwendung kann ein wenig schneller sein als IntStream.range wie es Brauch spliterator nach innen hat, so muss es nicht eine zusätzliche Lambda-execute (möglicherweise als langsamer polymorpher Ruf). Es bezieht sich auch auf das Array char[] nur einmal und nicht innerhalb des Lambda, so dass es mit nicht-endgültigen Array Variable oder Funktion Rückgabewert (wie CharBuffer.wrap(getCharArrayFromSomewhere()).chars()) verwendet werden kann.

6

Eine Möglichkeit, dies über ein String-Objekt zu tun ist:

char[] list = {'a','c','e'}; 
Stream<Character> charStream = new String(list).chars().mapToObj(i->(char)i); 

Ich mag es auf diese Art und Weise zu tun, weil alle die Komplexität der Anordnung der Umwandlung in die String Schöpfung gewickelt ist, und die Verpackung von char auch hinter der Szene für mich durchgeführt, damit ich mich auf die Geschäftslogik konzentrieren kann.