Actualmente, cada vez que necesito crear una secuencia desde una matriz, lo hago
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
¿Hay alguna forma directa de crear una secuencia desde una matriz?
fuente
Actualmente, cada vez que necesito crear una secuencia desde una matriz, lo hago
String[] array = {"x1", "x2"};
Arrays.asList(array).stream();
¿Hay alguna forma directa de crear una secuencia desde una matriz?
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 .
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 +1Stream.of
podría darte algunas sorpresas (como cuando llamasArrays.asList
con una matriz primitiva y que la gente espera unaList<Integer>
devolución) :-)Arrays.stream
admite la transmisión de un rango de la matriz, queIntStream.of
no lo hace. Por el contrario,Stream.of
es la mejor opción si desea unStream<int[]>
tamaño1
...Arrays.stream
es preferible a usarStream.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 quelimit(m)
no sabe si el tamaño esm
menor o igual quem
, mientras queArrays.stream
hace comprobaciones de rango y conoce el tamaño exacto de la transmisión.Arrays.stream(array,start,end)
devuelve unaStream
implementación cuya cuya aplicación está aquí , mientras que seStream.of(array).skip().limit()
devuelve unaStream
implementación cuya implementación está dentro de este método .Alternativa a la solución de @ sol4me:
De la diferencia entre esto y
Arrays.stream()
: hace una diferencia si su matriz es de un tipo primitivo. Por ejemplo, si haces:donde
someArray
es along[]
, devolverá unLongStream
.Stream.of()
, por otro lado, devolverá unStream<long[]>
con un solo elemento.fuente
Arrays.stream()
funciona para eso*Stream.of()
cuando tieneArrays.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 nadaArrays.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 . PrefieroArrays.stream()
para tales casos, lo que lo hace incorrecto como una regla general queStream.of()
es más conveniente (álgebra de Peano).O, si ya tiene una matriz, también puede hacer
Para tipos primitivos use
IntStream.of
oLongStream.of
etc.fuente
int[]
se puede pasar a un método que acepta varargs, ¿por qué no seStream.of(intArray)
produce un enStream<Integer>
lugar deStream<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 deObject[]
, pero es una subclase deObject
. Entonces, cuando se lo pasasStream.of
, se toma como elObject
parámetro, y obtienes una secuencia deint[]
. 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 losObject
gastos generales del boxeo (convertirint
aInteger
para que se vean como objetos normales).int[]
es unObject
, coincidiría con el método sobrecargadoof(T t)
y, por lo tanto, vuelveStream<int[]>
. Entonces, teóricamente hablando, si este método no estuviera disponible, ¿habríamos obtenido elStream<Integer>
a cambio? o tal vez resulte en un error de compilación porque no pudo encontrar el método de coincidencia? es decirint[]
, no puede ser tratado comoT...
Stream<Integer>
esa manera, porqueStream.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:
Actualización: Use full array.length (no length - 1).
fuente
Puedes usar Arrays.stream:
Esto asegura el tipo de retorno de vapor basado en el tipo de entrada de su matriz si
String []
luego se devuelveStream<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[]
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.fuente
rara vez visto, pero esta es la forma más directa
fuente