Puede crear métodos auxiliares que conviertan una lista (matriz) de tipo T
en una lista (matriz) de tipo U
utilizando la map
operación on stream
.
//for lists
public static <T, U> List<U> convertList(List<T> from, Function<T, U> func) {
return from.stream().map(func).collect(Collectors.toList());
}
//for arrays
public static <T, U> U[] convertArray(T[] from,
Function<T, U> func,
IntFunction<U[]> generator) {
return Arrays.stream(from).map(func).toArray(generator);
}
Y utilícelo así:
//for lists
List<String> stringList = Arrays.asList("1","2","3");
List<Integer> integerList = convertList(stringList, s -> Integer.parseInt(s));
//for arrays
String[] stringArr = {"1","2","3"};
Double[] doubleArr = convertArray(stringArr, Double::parseDouble, Double[]::new);
Tenga en cuenta que
s -> Integer.parseInt(s)
podría reemplazarse con
Integer::parseInt
(consulte las
referencias de métodos )
Lists.transform()
.fuente
Los métodos auxiliares de la respuesta aceptada no son necesarios. Los flujos se pueden utilizar con lambdas o, por lo general, se pueden acortar mediante referencias de método . Los flujos permiten operaciones funcionales.
map()
convierte los elementos ycollect(...)
otoArray()
envolver la parte posterior de flujo de carga en una matriz o colección.La charla de Venkat Subramaniam (video) lo explica mejor que yo.
1 Convertir
List<String>
aList<Integer>
2 Convertir
List<String>
aint[]
3 Convertir
String[]
aList<Integer>
4 Convertir
String[]
aint[]
5 Convertir
String[]
aList<Double>
6 (bonificación) Convertir
int[]
aString[]
Por supuesto, son posibles muchas más variaciones.
Consulte también la versión de Ideone de estos ejemplos . Puede hacer clic en la bifurcación y luego ejecutar para ejecutar en el navegador.
fuente
EDITAR: Como se señaló en los comentarios, esta es una versión mucho más simple: de
Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
esta manera podemos omitir toda la conversión hacia y desde una lista.Encontré otra solución de una línea, pero sigue siendo bastante lenta (toma alrededor de 100 veces más que un ciclo for; probado en una matriz de 6000 0)
Que hace esto:
fuente
Arrays.stream(stringArray).mapToInt(Integer::parseInt).toArray()
Para la lista:
Para matriz:
fuente
También puedes usar,
fuente
No lo encontré en las respuestas anteriores, entonces, con Java 8 y streams:
Convertir
String[]
aInteger[]
:fuente
Además, controla cuando la matriz de cadenas no tiene elementos:
fuente
Usé maptoInt () con la operación Lambda para convertir la cadena a Integer
fuente
Arrays.toString (int []) funciona para mí.
fuente