Respostas:
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 .
Stream.of
poderia dar-lhe algumas surpresas (como quando você chamar Arrays.asList
com uma matriz primitiva e que as pessoas esperam uma List<Integer>
volta) :-)
Arrays.stream
suporta streaming de um intervalo da matriz, o que IntStream.of
não. Em contraste, Stream.of
é a melhor escolha se você quer um Stream<int[]>
de tamanho 1
...
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.
Arrays.stream(array,start,end)
retorna a Stream
cuja implementação está aqui , enquanto Stream.of(array).skip().limit()
retorna a Stream
cuja implementação está dentro desse método .
Alternativa à solução da @ sol4me:
Stream.of(theArray)
Da diferença entre this e Arrays.stream()
: faz diferença se sua matriz é de um tipo primitivo. Por exemplo, se você fizer:
Arrays.stream(someArray)
onde someArray
é a long[]
, retornará a LongStream
. Stream.of()
, por outro lado, retornará a Stream<long[]>
com um único elemento.
Arrays.stream()
obras para isso também
*Stream.of()
quando você precisar Arrays.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 nada
Arrays.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 . Prefiro Arrays.stream()
para esses casos, o que torna errado como regra geral Stream.of()
mais conveniente (álgebra de Peano).
Stream.of("foo", "bar", "baz")
Ou, se você já possui uma matriz, também pode fazer
Stream.of(array)
Para tipos primitivos, use IntStream.of
ou LongStream.of
etc.
int[]
pode ser passado para um método que aceita varargs, por que não Stream.of(intArray)
produzir um em Stream<Integer>
vez de Stream<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 de Object[]
, mas é uma subclasse de Object
. Então, quando você passa para Stream.of
, ele é tomado como Object
parâmetro, e você recebe um fluxo de int[]
. 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 na Object
sobrecarga do boxe (convertendo int
para Integer
fazer parecer como objetos normais).
int[]
é um Object
, ele corresponderia ao método sobrecarregado of(T t)
e, portanto, retornará Stream<int[]>
. Então, teoricamente falando, se esse método não estivesse disponível, teríamos o Stream<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, porque Stream.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:
/**
* 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)
Você pode usar Arrays.stream:
Arrays.stream (matriz);
Isso garante o tipo de retorno de vapor com base no tipo de entrada do seu array, se String []
então retornar Stream<String>
, se int []
retornarIntStream
Quando você já conhece a matriz de tipos de entrada, é bom usar uma matriz específica, como para o tipo de entrada int[]
IntStream.of (matriz);
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.
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 +1