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.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 .
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 +1Stream.ofpodría darte algunas sorpresas (como cuando llamasArrays.asListcon una matriz primitiva y que la gente espera unaList<Integer>devolución) :-)Arrays.streamadmite la transmisión de un rango de la matriz, queIntStream.ofno lo hace. Por el contrario,Stream.ofes la mejor opción si desea unStream<int[]>tamaño1...Arrays.streames 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 esmmenor o igual quem, mientras queArrays.streamhace comprobaciones de rango y conoce el tamaño exacto de la transmisión.Arrays.stream(array,start,end)devuelve unaStreamimplementación cuya cuya aplicación está aquí , mientras que seStream.of(array).skip().limit()devuelve unaStreamimplementació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
someArrayes 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.ofoLongStream.ofetc.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 elObjectpará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 losObjectgastos generales del boxeo (convertirintaIntegerpara 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 regresaIntStreamCuando 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
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.fuente
rara vez visto, pero esta es la forma más directa
fuente