fundición y genéricos para habilitar la lista de concatenación en Java 8

gringogordo :

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 concatpiensa que tiene una lista de objetos que no son Strings (indicador: Tipo de cambio de ca List<Object>)?

¿Hay una manera fácil de hacer esto para que se vea un poco más pulido ?!

davidxxx:

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 Ttipo 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 Listque 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));

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=177236&siteId=1
Recomendado
Clasificación