muestra - ¿Cómo convertir un flujo de Java 8 a una matriz?
matriz java filas columnas (9)
¿Cuál es la forma más fácil / más corta de convertir un Java 8 Stream
en una matriz?
Convierta el texto en una matriz de cadenas donde separa cada valor con una coma y recorte cada campo, por ejemplo:
String[] stringArray = Arrays.stream(line.split(",")).map(String::trim).toArray(String[]::new);
El método más sencillo es usar el toArray(IntFunction<A[]> generator)
con una referencia de constructor de matriz. Esto se sugiere en la documentación de la API para el método .
String[] stringArray = stringStream.toArray(String[]::new);
Lo que hace es encontrar un método que toma un entero (el tamaño) como argumento, y devuelve una String[]
, que es exactamente lo que (una de las sobrecargas de) la new String[]
hace.
También puedes escribir tu propio IntFunction
:
Stream<String> stringStream = ...;
String[] stringArray = stringStream.toArray(size -> new String[size]);
El propósito del IntFunction<A[]> generator
es convertir un entero, el tamaño de la matriz, a una nueva matriz.
Código de ejemplo:
Stream<String> stringStream = Stream.of("a", "b", "c");
String[] stringArray = stringStream.toArray(size -> new String[size]);
Arrays.stream(stringArray).forEach(System.out::println);
Huellas dactilares:
a
b
c
El uso del toArray(IntFunction<A[]> generator)
es una manera muy elegante y segura de convertir (o más correctamente, recopilar) un Stream en una matriz del mismo tipo de Stream.
Sin embargo, si el tipo de matriz devuelta no es importante, simplemente usar el método toArray()
es más fácil y más corto. Por ejemplo:
Stream<Object> args = Stream.of(BigDecimal.ONE, "Two", 3);
System.out.printf("%s, %s, %s!", args.toArray());
Puede convertir una secuencia java 8 a una matriz usando este bloque de código simple:
String[] myNewArray3 = myNewStream.toArray(String[]::new);
Pero expliquemos las cosas más, primero, creemos una lista de cadenas con tres valores:
String[] stringList = {"Bachiri","Taoufiq","Abderrahman"};
Crear una secuencia de la matriz dada:
Stream<String> stringStream = Arrays.stream(stringList);
Ahora podemos realizar algunas operaciones en esta secuencia Ex:
Stream<String> myNewStream = stringStream.map(s -> s.toUpperCase());
y, finalmente, convertirlo en una matriz de Java 8 utilizando estos métodos:
Método 1-Classic (interfaz funcional)
IntFunction<String[]> intFunction = new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
};
String[] myNewArray = myNewStream.toArray(intFunction);
2 -Expresión lambda
String[] myNewArray2 = myNewStream.toArray(value -> new String[value]);
3- Método de referencia
String[] myNewArray3 = myNewStream.toArray(String[]::new);
Método de referencia Explicación:
Es otra forma de escribir una expresión lambda que es estrictamente equivalente a la otra.
Puede crear un colector personalizado que convierta una secuencia a una matriz.
public static <T> Collector<T, ?, T[]> toArray( IntFunction<T[]> converter )
{
return Collectors.collectingAndThen(
Collectors.toList(),
list ->list.toArray( converter.apply( list.size() ) ) );
}
y un uso rápido
List<String> input = Arrays.asList( ..... );
String[] result = input.stream().
.collect( CustomCollectors.**toArray**( String[]::new ) );
Puede hacerlo de varias maneras. Todas las formas son técnicamente iguales, pero usar Lambda simplificaría parte del código. Digamos que primero inicializamos una lista con String, la llamamos personas.
List<String> persons = new ArrayList<String>(){{add("a"); add("b"); add("c");}};
Stream<String> stream = persons.stream();
Ahora puedes usar cualquiera de las siguientes formas.
1.Utilizando la función toArray () de la interfaz de Stream que devuelve un objeto [] y luego lo convierte en String [].
String[] stringArray = (String [])stream.toArray();
2.Utilizar Lambda Expresiion para crear un nuevo StringArray con un tamaño definido.
String[] stringArray = stream.toArray(size->new String[size]);
3. Usando la referencia del método directamente.
String[] stringArray = stream.toArray(String[]::new);
Si desea obtener una serie de entradas, con valores de 1 a 10, de un Stream, hay IntStream a su disposición.
Aquí creamos un Stream con un método Stream.of y convertimos un Stream en un IntStream usando un mapToInt. Entonces podemos llamar al método toArray de IntStream.
Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10);
//or use this to create our stream
//Stream<Integer> stream = IntStream.rangeClosed(1, 10).boxed();
int[] array = stream.mapToInt(x -> x).toArray();
Aquí es lo mismo, sin el Stream, usando solo el IntStream
int[]array2 = IntStream.rangeClosed(1, 10).toArray();
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
Integer[] integers = stream.toArray(it->new Integer[it]);
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
int[] arr= stream.mapToInt(x->x.intValue()).toArray();