web-dev-qa-db-fra.com

Vous voulez créer un flux de caractères à partir d'un tableau de caractères dans java

À 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.

36
Sangjin Kim

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]);
29
Alexis C.

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.

19
Lars Hartviksen

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()).

16
Tagir Valeev

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 chars 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);
0
T.J. Mazeika