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?
la source
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 Eg
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 note Stream.of(intArray)
retournera Stream<int[]>
alors que Arrays.stream(intArr)
retournera à 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 Eg
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 au Stream.of
code suivant, il 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.
Mise à jour : comme mentionné par le commentaire de Stuart Marks La surcharge de sous-plage de Arrays.stream
est préférable à l'utilisation Stream.of(array).skip(n).limit(m)
car la première donne un flux SIZED alors que la seconde ne le fait pas. La raison est que limit(m)
ne sait pas si la taille est m ou inférieur à m, alors Arrays.stream
ne vérifie gamme et connaît la taille exacte du flux Vous pouvez lire le code source pour la mise en œuvre de flux retourné par Arrays.stream(array,start,end)
ici , alors que pour la mise en œuvre flux retourné par Stream.of(array).skip().limit()
est - dans cette méthode .
Arrays.stream
a tous les cas surchargés pour les tableaux primitifs. C'est à direStream.of(new int[]{1,2,3})
vous donnera unStream<int[]>
considérant vousArrays.stream
rendra unIntStream
qui est probablement ce que vous voulez. Donc +1Stream.of
pourrait vous donner des surprises (comme lorsque vous appelezArrays.asList
avec un tableau primitif et que les gens attendent unList<Integer>
retour) :-)Arrays.stream
prend en charge la diffusion en continu d'une plage du tableau, ce quiIntStream.of
ne le fait pas. En revanche,Stream.of
c'est le meilleur choix si vous voulez uneStream<int[]>
taille1
…Arrays.stream
est préférable à l'utilisationStream.of(array).skip(n).limit(m)
car la première donne un flux SIZED alors que la seconde ne le fait pas. La raison est quelimit(m)
cela ne sait pas si la taille estm
ou inférieure àm
, alorsArrays.stream
que la plage vérifie et connaît la taille exacte du flux.Arrays.stream(array,start,end)
renvoie aStream
dont l'implémentation est ici , alors queStream.of(array).skip().limit()
retourne aStream
dont l'implémentation est dans cette méthode .Alternative à la solution de @ sol4me:
De la différence entre ceci et
Arrays.stream()
: cela fait une différence si votre tableau est de type primitif. Par exemple, si vous faites:où
someArray
est along[]
, il retournera aLongStream
.Stream.of()
, d'autre part, retournera unStream<long[]>
avec un seul élément.la source
Arrays.stream()
fonctionne aussi pour cela*Stream.of()
lorsque vous avezArrays.stream()
affaire à des tableaux primitifs. Et pour ce qui est des tableaux qui ne sont pas des objets réels, eh bien, c'est Java, c'est le cas depuis la version 1.0, alors traitez-le; ruminer sur cela n'aide à rienArrays.stream()
n'est pas pratique, je considère que c'est pratique. Assez dit.*Stream.of()
est plus commode pour être fallacieux; parce que c'est une question de préférences . Je préfèreArrays.stream()
pour de tels cas, ce qui le rend faux en règle générale quiStream.of()
est plus pratique (algèbre Peano).Ou, si vous possédez déjà un tableau, vous pouvez également faire
Pour les types primitifs, utilisez
IntStream.of
ouLongStream.of
etc.la source
int[]
peut être passé à une méthode acceptant des varargs, pourquoi ne pasStream.of(intArray)
produire un à laStream<Integer>
place deStream<int[]>
? En outre, y a-t-il un raisonnement technique pour lequel il existe des classes Stream spécialisées pour les primitives?int[]
n'est pas comme les autres tableaux. Ce n'est pas une sous - classeObject[]
, mais il est une sous - classeObject
. Ainsi, lorsque vous le transmettez àStream.of
, il est considéré comme leObject
paramètre, et vous obtenez un flux deint[]
. C'est l'une des raisons d'avoir des classes spécialisées pour les primitifs - si vous ne créez pas de flux à partir de tableaux primitifs, ce serait assez pénible. L'autre raison est que les classes spécialisées sont plus efficaces, car elles n'ont pas besoin de supporter lesObject
frais généraux de la boxe (conversionint
enInteger
pour faire ressembler à des objets normaux).int[]
c'est unObject
, il correspondrait à la méthode surchargéeof(T t)
et donc il retourneStream<int[]>
. Donc, théoriquement, si cette méthode n’était pas disponible, nous aurions eu leStream<Integer>
retour? ou peut-être que cela entraîne une erreur de compilation car il n'a pas pu trouver la méthode correspondante? ieint[]
ne peut pas être traité commeT...
Stream<Integer>
cette façon, carStream.of(t ... T)
cela correspondrait toujours de la même manière.Vous pouvez également le faire par une méthode de bas niveau qui a l'option parallèle:
Mise à jour: utilisez full array.length (pas length - 1).
la source
Vous pouvez utiliser Arrays.stream:
Cela garantit le type de retour de vapeur en fonction de votre type d'entrée de tableau si son
String []
retourne alorsStream<String>
, siint []
alors retourneIntStream
Lorsque vous connaissez déjà le tableau de type d'entrée, il est bon d'en utiliser un spécifique comme pour le type d'entrée
int[]
Cela renvoie Intstream.
Dans le premier exemple, Java utilise la méthode
overloading
pour rechercher une méthode spécifique en fonction des types d'entrée, tandis que dans le second, vous connaissez déjà le type d'entrée et l'appel d'une méthode spécifique.la source
rarement vu, mais c'est le moyen le plus direct
la source