web-dev-qa-db-fra.com

Comment créer un flux depuis un tableau?

Actuellement, chaque fois que j'ai besoin de créer un flux à partir d'un tableau, je le fais

String[] array = {"x1", "x2"};
Arrays.asList(array).stream();

Existe-t-il un moyen direct de créer un flux à partir d'un tableau?

121
adam.kubi

Vous pouvez utiliser Arrays.stream E.g.

Arrays.stream(array);

Vous pouvez également utiliser Stream.of comme mentionné par @fge, qui ressemble à

public static<T> Stream<T> of(T... values) {
    return Arrays.stream(values);
}

Mais notez que Stream.of(intArray) retournera Stream<int[]> alors que Arrays.stream(intArr) renverra IntStream à condition que vous passiez un tableau de type int[]. Donc, en un mot pour le type primitif, vous pouvez observer la différence entre 2 méthodes, par exemple.

int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);

IntStream stream2 = Arrays.stream(arr); 

Lorsque vous passez un tableau primitif à Arrays.stream, le code suivant est appelé

public static IntStream stream(int[] array) {
    return stream(array, 0, array.length);
}

et lorsque vous passez un tableau primitif à Stream.of, le code suivant est appelé

 public static<T> Stream<T> of(T t) {
     return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
 }

Par conséquent, vous obtenez des résultats différents.

Updated: Comme indiqué par Stuart Marks comment La surcharge du sous-ensemble de Arrays.stream est préférable à l'utilisation de Stream.of(array).skip(n).limit(m) car le premier entraîne un flux SIZED, contrairement au dernier. La raison en est que limit(m) ne sait pas si la taille est inférieure ou égale à m, alors que Arrays.stream vérifie la plage et connaît la taille exacte du fluxVous pouvez lire le code source de l'implémentation du flux renvoyé par Arrays.stream(array,start,end)ici , alors que pour l’implémentation de flux renvoyée par Stream.of(array).skip().limit() se trouve dans cette méthode .

183
sol4me

Alternative à la solution de @ sol4me:

Stream.of(theArray)

De la différence entre this et Arrays.stream(): it does fait une différence si votre tableau est de type primitif. Par exemple, si vous le faites:

Arrays.stream(someArray)

someArray est un long[], il retournera un LongStream. Stream.of(), d'autre part, retournera un Stream<long[]> avec un seul élément.

41
fge
Stream.of("foo", "bar", "baz")

Ou, si vous avez déjà un tableau, vous pouvez aussi faire 

Stream.of(array) 

Pour les types primitifs, utilisez IntStream.of ou LongStream.of etc.

13
Dima

Vous pouvez utiliser Arrays.stream:

String [] renvoie ensuite Stream<String>, si int [] renvoie ensuite IntStream .

Quand vous connaissez déjà un tableau de type d’entrée, il est conseillé d’en utiliser un spécifique, comme pour le type d’entrée int[]

overloading pour rechercher une méthode spécifique en fonction des types d'entrée, tandis qu'en second lieu, vous connaissez déjà le type d'entrée et la méthode spécifique à l'appel. 

0
vipul patel

Vous pouvez le faire aussi par la méthode de bas niveau qui a l'option parallèle:

Mise à jour: Utilisez full array.length (not length - 1).

/** 
 * Creates a new sequential or parallel {@code Stream} from a
 * {@code Spliterator}.
 *
 * <p>The spliterator is only traversed, split, or queried for estimated
 * size after the terminal operation of the stream pipeline commences.
 *
 * @param <T> the type of stream elements
 * @param spliterator a {@code Spliterator} describing the stream elements
 * @param parallel if {@code true} then the returned stream is a parallel
 *        stream; if {@code false} the returned stream is a sequential
 *        stream.
 * @return a new sequential or parallel {@code Stream}
 *
 * <T> Stream<T> stream(Spliterator<T> spliterator, boolean parallel)
 */

StreamSupport.stream(Arrays.spliterator(array, 0, array.length), true)
0
merqlove