Atualmente, sempre que preciso criar fluxo a partir de uma matriz, eu faço
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Existe alguma maneira direta de criar fluxo a partir de uma matriz?
fonte
Atualmente, sempre que preciso criar fluxo a partir de uma matriz, eu faço
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
Existe alguma maneira direta de criar fluxo a partir de uma matriz?
Você pode usar Arrays.stream Eg
Arrays.stream(array);
Você também pode usar Stream.of
como mencionado pelo @fge, que parece
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
Mas note Stream.of(intArray)
que retornará Stream<int[]>
enquanto Arrays.stream(intArr)
retornará, IntStream
desde que você passe uma matriz do tipo int[]
. Então, em poucas palavras, para o tipo de primitivos, você pode observar a diferença entre 2 métodos.
int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);
IntStream stream2 = Arrays.stream(arr);
Quando você passa a matriz primitiva para Arrays.stream
, o código a seguir é chamado
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
e quando você passa a matriz primitiva para Stream.of
o código a seguir, é chamado
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Portanto, você obtém resultados diferentes.
Atualizado : como mencionado por Stuart Marks comment A sobrecarga de subintervalos Arrays.stream
é preferível ao uso, Stream.of(array).skip(n).limit(m)
porque o primeiro resulta em um fluxo SIZED, enquanto o último não. O motivo é que limit(m)
não se sabe se o tamanho é m ou menor que m, enquanto Arrays.stream
o range verifica e sabe o tamanho exato do fluxo Você pode ler o código-fonte para a implementação do fluxo retornado por Arrays.stream(array,start,end)
aqui , enquanto que para a implementação do fluxo retornado por Stream.of(array).skip().limit()
é dentro deste método .
Arrays.stream
tem todos os casos sobrecarregados para matrizes primitivas. Ou sejaStream.of(new int[]{1,2,3})
, você fornecerá umStream<int[]>
considerandoArrays.stream
, oIntStream
que provavelmente será o que você deseja. Então +1Stream.of
poderia dar-lhe algumas surpresas (como quando você chamarArrays.asList
com uma matriz primitiva e que as pessoas esperam umaList<Integer>
volta) :-)Arrays.stream
suporta streaming de um intervalo da matriz, o queIntStream.of
não. Em contraste,Stream.of
é a melhor escolha se você quer umStream<int[]>
de tamanho1
...Arrays.stream
é preferível ao uso,Stream.of(array).skip(n).limit(m)
porque o primeiro resulta em um fluxo SIZED, enquanto o último não. O motivo é quelimit(m)
não se sabe se o tamanho ém
ou menor quem
, enquantoArrays.stream
o range verifica e sabe o tamanho exato do fluxo.Arrays.stream(array,start,end)
retorna aStream
cuja implementação está aqui , enquantoStream.of(array).skip().limit()
retorna aStream
cuja implementação está dentro desse método .Alternativa à solução da @ sol4me:
Da diferença entre this e
Arrays.stream()
: faz diferença se sua matriz é de um tipo primitivo. Por exemplo, se você fizer:onde
someArray
é along[]
, retornará aLongStream
.Stream.of()
, por outro lado, retornará aStream<long[]>
com um único elemento.fonte
Arrays.stream()
obras para isso também*Stream.of()
quando você precisarArrays.stream()
ao lidar com matrizes primitivas. E quanto a matrizes não serem objetos reais, bem, isso é Java, esse tem sido o caso desde a versão 1.0, então lide com isso; remoendo isso ajuda nadaArrays.stream()
não ser conveniente, eu considero que seja conveniente. Disse o suficiente.*Stream.of()
mais conveniente para ser falacioso; porque é uma questão de preferências . PrefiroArrays.stream()
para esses casos, o que torna errado como regra geralStream.of()
mais conveniente (álgebra de Peano).Ou, se você já possui uma matriz, também pode fazer
Para tipos primitivos, use
IntStream.of
ouLongStream.of
etc.fonte
int[]
pode ser passado para um método que aceita varargs, por que nãoStream.of(intArray)
produzir um emStream<Integer>
vez deStream<int[]>
? Além disso, existe algum raciocínio técnico sobre o motivo de existirem classes Stream especializadas para primitivas?int[]
não é como outras matrizes. Não é uma subclasse deObject[]
, mas é uma subclasse deObject
. Então, quando você passa paraStream.of
, ele é tomado comoObject
parâmetro, e você recebe um fluxo deint[]
. Essa é uma das razões para ter aulas especializadas em primitivas - se você não criar fluxos a partir de matrizes primitivas seria muito doloroso. A outra razão, é que as classes especializadas são mais eficientes, porque o não precisa incorrer naObject
sobrecarga do boxe (convertendoint
paraInteger
fazer parecer como objetos normais).int[]
é umObject
, ele corresponderia ao método sobrecarregadoof(T t)
e, portanto, retornaráStream<int[]>
. Então, teoricamente falando, se esse método não estivesse disponível, teríamos oStream<Integer>
retorno? ou talvez isso resulte em um erro de compilação porque não foi possível encontrar o método correspondente? ou seja,int[]
não pode ser tratado comoT...
Stream<Integer>
assim, porqueStream.of(t ... T)
ainda corresponderiam da mesma maneira.Você pode fazer isso também pelo método de baixo nível, que tem a opção paralela:
Atualização: Use array.length completo (não comprimento - 1).
fonte
Você pode usar Arrays.stream:
Isso garante o tipo de retorno de vapor com base no tipo de entrada do seu array, se
String []
então retornarStream<String>
, seint []
retornarIntStream
Quando você já conhece a matriz de tipos de entrada, é bom usar uma matriz específica, como para o tipo de entrada
int[]
Isso retorna o Intstream.
No primeiro exemplo, Java usa o método
overloading
para localizar um método específico com base nos tipos de entrada, enquanto no segundo você já conhece o tipo de entrada e chama o método específico.fonte
raramente visto, mas esta é a maneira mais direta
fonte