Eu tenho um Map<String,List<String>>
e quero que ele se transforme Map<String,List<Long>>
porque cada um String
na lista representa um 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()))
);
Meu principal problema é que cada um String
pode não representar corretamente a Long
; pode haver algum problema. Long::valueOf
pode gerar exceções. Se for esse o caso, desejo retornar um valor nulo ou vazioMap<String,List<Long>>
Porque eu quero iterar depois neste output
mapa. Mas não posso aceitar nenhuma conversão de erro; nem mesmo um. Alguma idéia de como eu posso retornar uma saída vazia em caso de String incorreta -> Conversão longa?
java
java-8
java-stream
AntonBoarf
fonte
fonte
LongStream
se planeja removerempty
resultados)Respostas:
Que tal um explícito
catch
sobre a exceção:fonte
nfe.getMessage()
input.entrySet().stream() .filter(e -> e.getValue().stream().anyMatch(s -> !new Scanner(s).hasNextLong())) .map(Map.Entry::getKey) .findAny()
Pessoalmente, gosto de fornecer uma
Optional
entrada sobre a análise de números:Em seguida, usando seu próprio código (e ignorando a entrada incorreta):
Além disso, considere um método auxiliar para tornar isso mais sucinto:
Em seguida, você pode filtrar os resultados no coletor do seu stream:
Você também pode manter os
Optional
objetos vazios em suas listas e, comparando o índice deles no novoList<Optional<Long>>
(em vez deList<Long>
) com o originalList<String>
, pode encontrar a sequência que causou entradas incorretas. Você também pode simplesmente registrar essas falhas noMyClass#parseLong
No entanto, se seu desejo é não funcionar com nenhuma entrada ruim, cercar todo o fluxo no que você está tentando capturar (de acordo com a resposta de Naman) é o caminho que eu seguiria.
fonte
Você pode criar uma
StringBuilder
chave for com exceção e verificar seele
é numérico como abaixo,Espero que ajude.
fonte
Pode ser que você possa escrever um método auxiliar que possa procurar numéricos na sequência e filtrá-los do fluxo e também valores nulos e, finalmente, coletar no Mapa.
Isso vai cuidar de tudo.
E use isso no seu stream.
fonte