Respuestas:
Puedes usar Arrays.stream Eg
Arrays.stream(array);
También puede usar Stream.ofcomo lo menciona @fge, que se ve así
public static<T> Stream<T> of(T... values) {
return Arrays.stream(values);
}
Pero note Stream.of(intArray)volverá Stream<int[]>mientras Arrays.stream(intArr)que regresará IntStreamsiempre que pase una matriz de tipos int[]. Entonces, en pocas palabras para los tipos primitivos, puede observar la diferencia entre 2 métodos
int[] arr = {1, 2};
Stream<int[]> arr1 = Stream.of(arr);
IntStream stream2 = Arrays.stream(arr);
Cuando pasa matriz primitiva a Arrays.stream, se invoca el siguiente código
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
y cuando pasa matriz primitiva al Stream.ofsiguiente código se invoca
public static<T> Stream<T> of(T t) {
return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false);
}
Por lo tanto, obtienes resultados diferentes.
Actualizado : como lo menciona el comentario de Stuart Marks. La sobrecarga de subrango de Arrays.streames preferible a usar Stream.of(array).skip(n).limit(m)porque la primera da como resultado una secuencia TAMAÑO mientras que la segunda no. La razón es que limit(m)no sabe si el tamaño es m o menor que m, mientras Arrays.streamque comprueba el rango y conoce el tamaño exacto de la secuencia. Puede leer el código fuente para la implementación de la secuencia devuelta Arrays.stream(array,start,end) aquí , mientras que para la implementación de la secuencia devuelta Stream.of(array).skip().limit()es dentro de este método .
Stream.ofpodría darte algunas sorpresas (como cuando llamas Arrays.asListcon una matriz primitiva y que la gente espera una List<Integer>devolución) :-)
Arrays.streamadmite la transmisión de un rango de la matriz, que IntStream.ofno lo hace. Por el contrario, Stream.ofes la mejor opción si desea un Stream<int[]>tamaño 1...
Arrays.streames preferible a usar Stream.of(array).skip(n).limit(m)porque la primera da como resultado una secuencia TAMAÑO mientras que la segunda no. La razón es que limit(m)no sabe si el tamaño es mmenor o igual que m, mientras que Arrays.streamhace comprobaciones de rango y conoce el tamaño exacto de la transmisión.
Arrays.stream(array,start,end)devuelve una Streamimplementación cuya cuya aplicación está aquí , mientras que se Stream.of(array).skip().limit()devuelve una Streamimplementación cuya implementación está dentro de este método .
Alternativa a la solución de @ sol4me:
Stream.of(theArray)
De la diferencia entre esto y Arrays.stream(): hace una diferencia si su matriz es de un tipo primitivo. Por ejemplo, si haces:
Arrays.stream(someArray)
donde someArrayes a long[], devolverá unLongStream . Stream.of(), por otro lado, devolverá un Stream<long[]>con un solo elemento.
Arrays.stream()funciona para eso
*Stream.of()cuando tiene Arrays.stream()cuando se trata de matrices primitivas. Y en cuanto a que las matrices no son objetos reales, bueno, esto es Java, este ha sido el caso desde 1.0, así que trátelo; meditar sobre esto no ayuda nada
Arrays.stream()no es conveniente, yo considero que es conveniente. Basta de charla.
*Stream.of()es más conveniente para ser falaz; porque es una cuestión de preferencias . Prefiero Arrays.stream()para tales casos, lo que lo hace incorrecto como una regla general que Stream.of()es más conveniente (álgebra de Peano).
Stream.of("foo", "bar", "baz")
O, si ya tiene una matriz, también puede hacer
Stream.of(array)
Para tipos primitivos use IntStream.ofo LongStream.ofetc.
int[]se puede pasar a un método que acepta varargs, ¿por qué no se Stream.of(intArray)produce un en Stream<Integer>lugar de Stream<int[]>? Además, ¿hay algún razonamiento técnico por el que hay clases de Stream especializadas para primitivas?
int[]No es como otras matrices. No es una subclase de Object[], pero es una subclase de Object. Entonces, cuando se lo pasas Stream.of, se toma como el Objectparámetro, y obtienes una secuencia de int[]. Esa es una de las razones para tener clases especializadas para primitivas: si no crearas secuencias a partir de matrices primitivas, sería bastante doloroso. La otra razón es que las clases especializadas son más eficientes, ya que no es necesario incurrir en los Objectgastos generales del boxeo (convertir inta Integerpara que se vean como objetos normales).
int[]es un Object, coincidiría con el método sobrecargado of(T t)y, por lo tanto, vuelve Stream<int[]>. Entonces, teóricamente hablando, si este método no estuviera disponible, ¿habríamos obtenido el Stream<Integer>a cambio? o tal vez resulte en un error de compilación porque no pudo encontrar el método de coincidencia? es decir int[], no puede ser tratado comoT...
Stream<Integer>esa manera, porque Stream.of(t ... T) aún coincidiría de la misma manera.
También puede hacerlo mediante un método de bajo nivel que tiene una opción 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)
Puedes usar Arrays.stream:
Arrays.stream (matriz);
Esto asegura el tipo de retorno de vapor basado en el tipo de entrada de su matriz si String []luego se devuelve Stream<String>, siint [] luego regresaIntStream
Cuando ya conoces la matriz de tipo de entrada, entonces es bueno usar una específica como tipo de entrada int[]
IntStream.of (matriz);
Esto devuelve Intstream.
En el primer ejemplo, Java usa un método overloadingpara encontrar un método específico basado en tipos de entrada, mientras que en el segundo ya conoce el tipo de entrada y el método específico de llamada.
Arrays.streamtiene todos los casos sobrecargados para matrices primitivas. Es decir,Stream.of(new int[]{1,2,3})le dará unStream<int[]>mientrasArrays.streamque le devolverá unoIntStreamque probablemente sea lo que desea. Entonces +1