Как добавить элементы на карту, если нет ключей от другой карты - PullRequest
1 голос
/ 04 июля 2019

У меня есть поток, который берет список объектов и создает карту, группируя их по идентификатору и считая повторения для каждого элемента. Однако, прежде чем закрыть поток и вернуть карту, мне нужно проверить, все ли идентификаторы (ключи) с другой карты (которая у меня уже есть) присутствуют в новой, если нет, я должен добавить их со значением по умолчанию 0. Важно выполнить такую ​​операцию в том же потоке, поскольку я пытаюсь научиться этому и действительно хочу сделать код максимально компактным и читабельным.

Ниже приведена первая часть кода, теперь мне нужно проверить, какие идентификаторы с другой карты отсутствуют в новой созданной, и добавить их со значением 0.

return bookings.stream()
        .collect(Collectors.groupingBy(a -> a.getID(), Collectors.counting()));

РЕДАКТИРОВАТЬ:

Чтобы уточнить, это то, что мне нужно сделать, но я бы хотел выполнить все операции, указанные ниже в исходном потоке.

Map<Integer,Long> res = bookings.stream()
        .collect(Collectors.groupingBy(a -> a.getID(), Collectors.counting()));
map2.keySet().stream().forEach(r -> res.putIfAbsent(r,0L));
return res;

1 Ответ

2 голосов
/ 05 июля 2019

Есть много способов сделать это, но "сделать код максимально компактным и читабельным" практически невозможно.Одно из решений, которое вы можете рассмотреть, это Collectors.collectingAndThen().С этим коллектором вы можете добавить финишер к данному коллектору.так что вы можете запустить Map.putIfAbsent() для всех ключей в финишере:

Map<Integer, Long> result = bookings.stream()
        .collect(Collectors.collectingAndThen(
                Collectors.groupingBy(Booking::getCampoID, Collectors.counting()),
                map -> {
                    map2.keySet().forEach(k -> map.putIfAbsent(k, 0L));
                    return map;
                }));

Но на самом деле код, который у вас уже есть, выглядит для меня очень компактным и читабельным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...