À partir d'un tableau de caractères, je veux construire un flux pour utiliser Java 8 fonctionnalités telles que les filtres et les cartes.
char[] list = {'a','c','e'};
Stream<Character> cStream = Stream.of(list);
// Stream<Character> cStream = Arrays.stream(list);
La première méthode ne fonctionne pas (Raison: changez cStream en Stream<char[]>
). La ligne commentée ne fonctionne pas également (Raison: la méthode stream(T[])
dans le type Tableaux n'est pas applicable pour les arguments (char[]
)).
Je sais que si char[] list
Est changé en int[]
, Tout fonctionne bien en utilisant IntStream
. Mais je ne veux pas convertir chaque char[]
En int[]
À chaque fois ou changer en liste lorsque j'ai besoin d'utiliser la bibliothèque de flux sur le tableau char
.
Vous pouvez utiliser un IntStream
pour générer les indices suivi de mapToObj
:
char[] arr = {'a','c','e'};
Stream<Character> cStream = IntStream.range(0, arr.length).mapToObj(i -> arr[i]);
Une façon de le faire est via un objet String:
char[] list = {'a','c','e'};
Stream<Character> charStream = new String(list).chars().mapToObj(i->(char)i);
J'aime le faire de cette façon car toute la complexité de la transformation du tableau est enveloppée dans la création de chaîne, et l'encapsulation de char est également effectuée en arrière-plan pour moi afin que je puisse me concentrer sur la logique métier.
Un moyen court et efficace de créer un IntStream
à partir du tableau char[]
Consiste à utiliser Java.nio.CharBuffer
:
char[] list = {'a','c','e'};
IntStream stream = CharBuffer.wrap(list).chars();
De cette façon, vous pouvez utiliser un IntStream
interprétant les valeurs int comme des caractères. Si vous voulez un Stream<Character>
Encadré (qui peut être moins efficace), utilisez
Stream<Character> stream = CharBuffer.wrap(list).chars().mapToObj(ch -> (char)ch);
L'utilisation de CharBuffer
peut être un peu plus rapide que IntStream.range
Car il possède un séparateur personnalisé à l'intérieur, il n'a donc pas à exécuter un lambda supplémentaire (peut-être comme un appel polymorphe lent). En outre, il ne fait référence au tableau char[]
Qu'une seule fois et non à l'intérieur du lambda, il peut donc être utilisé avec une variable de tableau non finale ou une valeur de retour de fonction (comme CharBuffer.wrap(getCharArrayFromSomewhere()).chars()
).
La modification la plus simple que vous pouvez apporter au code est la modification char[]
à Character[]
.
Une autre façon consiste à créer une nouvelle liste de tableaux des char
s encadrés:
char[] list = {'a','c','e'};
List<Character> listArray = new ArrayList<>();
for (char c : list)
listArray.add(c);
Stream<Character> cStream = listArray.stream();
De plus, vous pouvez utiliser la classe Chars
de Google Guava pour remplacer la boucle for
par:
List<Character> listArray = Chars.asList(list);