У меня есть список карт с определенными ключами, которые соответствуют строковым значениям.Java Map Lambda Exception
Что-то вроде List<Map<String,String>> aMapList;
Цель: поток по этому списку карт и собирать значения одного ключа во всех картах.
Как я это делаю ->
key = "somekey";
aMapList.stream().map(a -> a.get(key)).collect(Collectors.averagingInt());
Проблема: я получаю исключение из-за a.get (ключ), если нет такого ключа! потому что усреднение этого даст нуль. Как проверить или сделать лямбда игнорировать любые такие карты и двигаться дальше.
Я знаю, что я могу добавить фильтр на a -> a.contains(key)
, а затем продолжить. Редактировать: Я могу добавить еще несколько фильтров или просто проверить несколько условий на одном фильтре. Возможное решение:
aMapList.stream().filter(a -> a.contains(key)).
map(a -> a.get(key)).collect(Collectors.averagingInt());
Может ли это быть красивей? Вместо того, чтобы останавливать операцию, просто пропустите их? Есть ли еще один общий способ пропускать исключения или нули. Например. Мы можем развернуть лямбда и поставить блок try-catch, но мне все равно нужно что-то вернуть, что, если я хочу сделать эквивалент «продолжить».
Например.
(a -> {return a.get(key) }).
Может быть расширен ->
(a -> {try{return a.get(key)}
catch(Exception e){return null} }).
Значение выше по-прежнему возвращает нуль, а не просто пропуская.
Я выбираю лучший ответ для предоставления двух вариантов, но я не нашел их красивее. Кажется, что для этого подходят цепочки фильтров.
Почему у вас есть исключения? Разве вы не получите нуль? –
Я знаю одно решение. Я просто спрашиваю, могу ли я сделать это короче. Слишком много фильтров выглядят уродливыми и запутывают. – Pranay
@ cricket_007, потому что будущие операции будут вызывать исключение. Я получу нуль, но потом он сломается позже и выбросит исключение. – Pranay