Tengo un Map<String,List<String>>
y quiero que se convierta Map<String,List<Long>>
porque cada uno String
en 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 String
puede no representar correctamente a Long
; Puede haber algún problema. Long::valueOf
puede 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 output
mapa. 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
LongStream
si planea eliminar losempty
resultados)Respuestas:
¿Qué tal un explícito
catch
sobre 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
Optional
informació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
Optional
objetos 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#parseLong
Sin 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
StringBuilder
clave for con excepción y verificar siele
es 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