Quel est le moyen le plus simple/le plus court de convertir un Java 8 Stream
en un tableau?
La méthode la plus simple consiste à utiliser la méthode toArray(IntFunction<A[]> generator)
avec une référence de constructeur de tableau. Ceci est suggéré dans le documentation de l'API pour la méthode .
String[] stringArray = stringStream.toArray(String[]::new);
Ce qu'il fait est de trouver une méthode qui prend un entier (la taille) comme argument et retourne un String[]
, qui correspond exactement à ce que (l'une des surcharges de) new String[]
fait.
Vous pouvez aussi écrire votre propre IntFunction
:
Stream<String> stringStream = ...;
String[] stringArray = stringStream.toArray(size -> new String[size]);
Le but du IntFunction<A[]> generator
est de convertir un entier, la taille du tableau, en un nouveau tableau.
Exemple de code:
Stream<String> stringStream = Stream.of("a", "b", "c");
String[] stringArray = stringStream.toArray(size -> new String[size]);
Arrays.stream(stringArray).forEach(System.out::println);
Impressions:
a
b
c
Si vous souhaitez obtenir un tableau d'ints, avec des valeurs comprises entre 1 et 10, à partir d'un flux, IntStream est à votre disposition.
Ici, nous créons un Stream avec une méthode Stream.of et convertissons un Stream en IntStream à l’aide de mapToInt. Ensuite, nous pouvons appeler la méthode toArray d'IntStream.
Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10);
//or use this to create our stream
//Stream<Integer> stream = IntStream.rangeClosed(1, 10).boxed();
int[] array = stream.mapToInt(x -> x).toArray();
Voici la même chose, sans le flux, en utilisant uniquement le IntStream
int[]array2 = IntStream.rangeClosed(1, 10).toArray();
Vous pouvez convertir un flux Java 8 en un tableau à l'aide de ce bloc de code simple:
String[] myNewArray3 = myNewStream.toArray(String[]::new);
Mais expliquons davantage les choses, commençons par créer une liste de chaînes contenant trois valeurs:
String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};
Créer un flux à partir du tableau donné:
Stream<String> stringStream = Arrays.stream(stringList);
nous pouvons maintenant effectuer quelques opérations sur ce flux Ex:
Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase());
et finalement le convertir en un tableau Java 8 à l'aide de ces méthodes:
Méthode 1-Classic (Interface fonctionnelle)
IntFunction<String[]> intFunction = new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
};
String[] myNewArray = myNewStream.toArray(intFunction);
2-expression Lambda
String[] myNewArray2 = myNewStream.toArray(value -> new String[value]);
3- Référence de la méthode
String[] myNewArray3 = myNewStream.toArray(String[]::new);
Référence de la méthode Explication:
C'est une autre façon d'écrire une expression lambda strictement équivalente à l'autre.
Convertissez le texte en tableau de chaînes en séparant chaque valeur par une virgule et en découpant chaque champ, par exemple:
String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);
Vous pouvez créer un collecteur personnalisé qui convertit un flux en tableau.
public static <T> Collector<T, ?, T[]> toArray( IntFunction<T[]> converter )
{
return Collectors.collectingAndThen(
Collectors.toList(),
list ->list.toArray( converter.apply( list.size() ) ) );
}
et une utilisation rapide
List<String> input = Arrays.asList( ..... );
String[] result = input.stream().
.collect( CustomCollectors.**toArray**( String[]::new ) );
Utiliser la méthode toArray(IntFunction<A[]> generator)
est en effet un moyen très élégant et sûr de convertir (ou plus correctement, de collecter) un flux en un tableau du même type que le flux.
Cependant, si le type du tableau retourné n'est pas important, le simple fait d'utiliser la méthode toArray()
est à la fois plus simple et plus court. Par exemple:
Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
System.out.printf("%s, %s, %s!", args.toArray());
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
int[] arr= stream.mapToInt(x->x.intValue()).toArray();