Tengo un Map<String,List<String>>y quiero que se convierta Map<String,List<Long>>porque cada uno Stringen la lista representa un Long:
Map<String,List<String>> input = ...;
Map<String,List<Long>> output=
input.entrySet()
.stream()
.collect(toMap(Entry::getKey, e -> e.getValue().stream()
.map(Long::valueOf)
.collect(toList()))
);
Mi principal problema es que cada uno Stringpuede no representar correctamente a Long; Puede haber algún problema. Long::valueOfpuede plantear excepciones. Si este es el caso, quiero devolver un valor nulo o vacíoMap<String,List<Long>>
Porque quiero iterar después sobre este outputmapa. Pero no puedo aceptar ninguna conversión de error; Ni siquiera uno solo. ¿Alguna idea de cómo puedo devolver una salida vacía en caso de una cadena incorrecta -> Conversión larga?
java
java-8
java-stream
AntonBoarf
fuente
fuente

LongStreamsi planea eliminar losemptyresultados)Respuestas:
¿Qué tal un explícito
catchsobre la excepción:fuente
nfe.getMessage()input.entrySet().stream() .filter(e -> e.getValue().stream().anyMatch(s -> !new Scanner(s).hasNextLong())) .map(Map.Entry::getKey) .findAny()Personalmente, me gusta proporcionar
Optionalinformación sobre el análisis de números:Luego, usando su propio código (e ignorando la entrada incorrecta):
Además, considere un método auxiliar para hacer esto más conciso:
Luego puede filtrar los resultados en el recopilador de su transmisión:
También puede mantener los
Optionalobjetos vacíos en sus listas, y luego al comparar su índice en el nuevoList<Optional<Long>>(en lugar deList<Long>) con el originalList<String>, puede encontrar la cadena que causó cualquier entrada errónea. También puede simplemente registrar estas fallas enMyClass#parseLongSin embargo, si su deseo es no operar con ninguna entrada incorrecta, entonces rodear todo el flujo en lo que está tratando de atrapar (según la respuesta de Naman) es la ruta que tomaría.
fuente
Puede crear una
StringBuilderclave for con excepción y verificar sielees numérica como se muestra a continuación,Espero eso ayude.
fuente
Puede ser que pueda escribir un método auxiliar que pueda verificar los valores numéricos en la cadena y filtrarlos de la secuencia y también los valores nulos y luego finalmente recopilarlos en el Mapa.
Esto se encargará de todo.
Y usa esto en tu transmisión.
fuente