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?
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 .
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)
où someArray
est un long[]
, il retournera un LongStream
. Stream.of()
, d'autre part, retournera un Stream<long[]>
avec un seul élément.
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.
Vous pouvez utiliser Arrays.stream:
String []
renvoie ensuiteStream<String>
, siint []
renvoie ensuiteIntStream
.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.
Vous pouvez le faire aussi par la méthode de bas niveau qui a l'option parallèle:
/**
* 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)