J'ai un Map<String,List<String>>
et je veux qu'il se transforme en Map<String,List<Long>>
parce que chacun String
dans la liste représente 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()))
);
Mon principal problème est que chacun String
peut ne pas représenter correctement un Long
; il peut y avoir un problème. Long::valueOf
peut soulever des exceptions. Si tel est le cas, je veux retourner une valeur nulle ou videMap<String,List<Long>>
Parce que je veux répéter après cette output
carte. Mais je ne peux accepter aucune conversion d'erreur; pas même un seul. Une idée de la façon dont je peux retourner une sortie vide en cas de chaîne incorrecte -> Conversion longue?
java
java-8
java-stream
AntonBoarf
la source
la source
LongStream
si vous prévoyez de supprimer lesempty
résultats)Réponses:
Que diriez-vous d'un explicite
catch
sur l'exception:la source
nfe.getMessage()
input.entrySet().stream() .filter(e -> e.getValue().stream().anyMatch(s -> !new Scanner(s).hasNextLong())) .map(Map.Entry::getKey) .findAny()
Personnellement, j'aime fournir une
Optional
entrée sur l'analyse des nombres:Ensuite, en utilisant votre propre code (et en ignorant les mauvaises entrées):
En outre, envisagez une méthode d'assistance pour rendre cela plus succinct:
Ensuite, vous pouvez filtrer les résultats dans le collecteur de votre flux:
Vous pouvez également conserver les
Optional
objets vides dans vos listes, puis en comparant leur index dans le nouveauList<Optional<Long>>
(au lieu deList<Long>
) avec l'originalList<String>
, vous pouvez trouver la chaîne qui a causé des entrées erronées. Vous pouvez également simplement enregistrer ces échecs dansMyClass#parseLong
Cependant, si votre désir est de ne pas opérer sur une mauvaise entrée, entourer tout le flux dans ce que vous essayez d'attraper (selon la réponse de Naman) est la route que je prendrais.
la source
Vous pouvez créer une
StringBuilder
clé for avec exception et vérifier si elleele
est numérique comme ci-dessous,J'espère que cela aide.
la source
Peut-être que vous pouvez écrire une méthode d'assistance qui peut vérifier la valeur numérique dans la chaîne et les filtrer du flux ainsi que les valeurs nulles, puis collecter finalement sur la carte.
Cela prendra soin de tout.
Et utilisez-le dans votre flux.
la source