Mam Map<String,List<String>>
i chcę, aby się zmieniło, Map<String,List<Long>>
ponieważ każdy String
na liście reprezentuje 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()))
);
Moim głównym problemem jest to, że każdy z nich String
może nie przedstawiać poprawnie Long
: może być jakiś problem.Long::valueOf
może zgłaszać wyjątki. W takim przypadku chcę zwrócić wartość zerową lub pustąMap<String,List<Long>>
Ponieważ chcę iterować po tej output
mapie. Ale nie mogę zaakceptować żadnej konwersji błędu; ani jednego. Masz pomysł, jak mogę zwrócić puste wyjście w przypadku niepoprawnego ciągu -> Długa konwersja?
java
java-8
java-stream
AntonBoarf
źródło
źródło
LongStream
jeśli planujesz usunąćempty
wyniki)Odpowiedzi:
Co powiesz na wyraźny
catch
wyjątek:źródło
nfe.getMessage()
input.entrySet().stream() .filter(e -> e.getValue().stream().anyMatch(s -> !new Scanner(s).hasNextLong())) .map(Map.Entry::getKey) .findAny()
Osobiście lubię podawać dane
Optional
wejściowe dotyczące analizowania liczb:Następnie, używając własnego kodu (i ignorując złe dane wejściowe):
Dodatkowo rozważ metodę pomocniczą, aby uczynić to bardziej zwięzłym:
Następnie możesz filtrować wyniki w kolektorze strumienia:
Możesz także zachować puste
Optional
obiekty na swoich listach, a następnie porównując ich indeks w nowymList<Optional<Long>>
(zamiastList<Long>
) z oryginałemList<String>
, możesz znaleźć ciąg, który spowodował błędne dane wejściowe. Możesz także po prostu zalogować się do tych awariiMyClass#parseLong
Jednakże, jeśli pragnieniem jest, aby nie działać na każdym nieudanym wejściu w ogóle, to otaczająca cały strumień w co próbujesz złapać za odpowiedź Naman (za) jest droga wziąłbym.
źródło
Możesz utworzyć
StringBuilder
klucz for z wyjątkiem i sprawdzić, czyele
ma wartość numeryczną, jak poniżej,Mam nadzieję, że to pomoże.
źródło
Być może możesz napisać metodę pomocniczą, która może sprawdzić wartości liczbowe w ciągu i odfiltrować je ze strumienia, a także wartości zerowe, a następnie zebrać do mapy.
To załatwi wszystko.
I użyj tego w swoim strumieniu.
źródło