Respuestas:
Puedes usar Arrays.stream Eg
Arrays.stream(array);
También puede usar Stream.of
como 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á IntStream
siempre 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.of
siguiente 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.stream
es 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.stream
que 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.of
podría darte algunas sorpresas (como cuando llamas Arrays.asList
con una matriz primitiva y que la gente espera una List<Integer>
devolución) :-)
Arrays.stream
admite la transmisión de un rango de la matriz, que IntStream.of
no lo hace. Por el contrario, Stream.of
es la mejor opción si desea un Stream<int[]>
tamaño 1
...
Arrays.stream
es 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
menor o igual que m
, mientras que Arrays.stream
hace comprobaciones de rango y conoce el tamaño exacto de la transmisión.
Arrays.stream(array,start,end)
devuelve una Stream
implementación cuya cuya aplicación está aquí , mientras que se Stream.of(array).skip().limit()
devuelve una Stream
implementació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 someArray
es 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.of
o LongStream.of
etc.
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 Object
pará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 Object
gastos generales del boxeo (convertir int
a Integer
para 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 overloading
para 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.stream
tiene todos los casos sobrecargados para matrices primitivas. Es decir,Stream.of(new int[]{1,2,3})
le dará unStream<int[]>
mientrasArrays.stream
que le devolverá unoIntStream
que probablemente sea lo que desea. Entonces +1