Disculpas que es probablemente el peor título que he usado, pero yo no puedo imaginar cómo es la palabra.
Voy a llamar a un método table.getColData (COL_1) que devuelve un genérico
public <T extends Object> List<T> getColData(final String col)
Estoy llamando dos veces y conseguir dos listas de cadenas. Quiero concatenar estos y he terminado con esto -
List<String> a = table.getColData(col1);
List<String> b = table.getColData(col2);
List <String> c = Stream.concat(a.stream(), b.stream()).collect(Collectors.toList());
que trabaja muy bien, creo. No puedo encontrar una manera de evitar las declaraciones 2, aunque sin conseguir un error como el concat
piensa que tiene una lista de objetos que no son String
s (indicador: Tipo de cambio de c
a List<Object>
)?
¿Hay una manera fácil de hacer esto para que se vea un poco más pulido ?!
Usted está limitado por la inferencia de que el compilador.
List <String> c = Stream.concat(getColDataStream(col1).stream(), getColDataStream(col2).stream()).collect(Collectors.toList());
no puede compilar porque getColDataStream()
retorno como se infiere List<Object>
que no se especifica un tipo de destino desde el lado invocación.
Puede concatenar dos corrientes de List<Object>
pero no va a producir Stream<String>
, pero Stream<Object>
.
La introducción de dos variables intermedias no es necesaria la mejor manera.
1) Como alternativa según lo sugerido por Holger se podría especificar el T
tipo del lado de destino:
Stream.concat(table.<String>getColData(col1).stream(), table.<String>getColData(col2).stream())
.collect(Collectors.toList());
2) También puede transformar Stream<Object>
a Stream<String>
una map()
operación:
List<String> c = Stream.concat(table.getColData(col1).stream(), table.getColData(col2).stream())
.map(s -> (String) s)
.collect(Collectors.toList());
3) o la introducción de un método adicional que impide cualquier conversión explícita mediante la concatenación de las corrientes de las listas, y recogiéndola en una List
que devuelve:
public <T> List<T> concatAndCollectToList(final List<T> a, List<T> b) {
return Stream.concat(a.stream(), b.stream())
.collect(Collectors.toList());
}
Ahora puede hacer precisamente:
List<String> c = concatAndCollectToList(table.getColData(col1), table.getColData(col2));