У меня есть Map<String,List<String>>
и хочу, чтобы он превратился, Map<String,List<Long>>
потому что каждый String
в списке представляет 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()))
);
Моя главная проблема заключается в том, что каждый из них String
не может правильно представлять a Long
; может быть какая-то проблема. Long::valueOf
может поднять исключения. Если это так, я хочу вернуть нулевой или пустойMap<String,List<Long>>
Потому что я хочу повторить эту output
карту. Но я не могу принять любую ошибку преобразования; ни одного. Любая идея о том, как я могу вернуть пустой вывод в случае неправильного преобразования String -> Long?
java
java-8
java-stream
AntonBoarf
источник
источник
LongStream
если планируете удалятьempty
результаты)Ответы:
Как насчет явного
catch
над исключением:источник
nfe.getMessage()
input.entrySet().stream() .filter(e -> e.getValue().stream().anyMatch(s -> !new Scanner(s).hasNextLong())) .map(Map.Entry::getKey) .findAny()
Я лично хотел бы предоставить
Optional
информацию о разборе числа:Затем, используя свой собственный код (и игнорируя неверный ввод):
Кроме того, рассмотрите вспомогательный метод, чтобы сделать это более кратким:
Затем вы можете отфильтровать результаты в коллекторе вашего потока:
Вы также можете сохранить пустые
Optional
объекты в своих списках, а затем, сравнивая их индекс в новомList<Optional<Long>>
(а неList<Long>
) с оригиналомList<String>
, вы можете найти строку, которая вызвала какие-либо ошибочные данные. Вы также можете просто зарегистрировать эти сбои вMyClass#parseLong
Однако, если вы хотите вообще не работать с каким-либо неверным вводом, то окружение всего потока тем, что вы пытаетесь поймать (согласно ответу Намана), - это мой путь.
источник
Вы можете создать
StringBuilder
ключ для исключения и проверить,ele
является ли он числовым, как показано ниже,Надеюсь, поможет.
источник
Может быть, вы можете написать вспомогательный метод, который может проверять числовые значения в строке и отфильтровывать их из потока, а также нулевые значения, а затем, наконец, собирать на карту.
Это позаботится обо всем.
И используйте это в своей ленте.
источник