Как преобразовать Map<Integer, List<Integer>> в Map<Integer, Integer> с помощью Stream API в Java
Что проверяют
Умеете ли вы собрать Map через Collectors.toMap и видите ли подвохи этого коллектора. Сама формулировка неполная: во что превращать список, в сумму, размер или максимум, нужно уточнить. Следом спрашивают про пустые списки, null и порядок ключей.
Как отвечать
Сначала уточните правило свёртки, затем покажите каркас:
Map<Integer, Integer> result = source.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().stream().mapToInt(Integer::intValue).sum()));Дальше проговорите детали:
- ключи не повторяются: исходная мапа уже гарантирует уникальность, поэтому функция слияния не нужна. Если бы ключи вычислялись заново, дубль дал бы
IllegalStateException, и понадобился бы третий аргумент(a, b) -> a + b; - пустой список:
sum()вернёт 0, аmax()вернётOptionalInt, и значение для пустого списка придётся выбрать явно; null:toMapне принимаетnullкак значение и падает сNullPointerException, аnullвнутри списка уронитintValue. Такие элементы фильтруют заранее;- тип и порядок:
toMapпо умолчанию собираетHashMap. Нужен порядок исходника или сортировка, передайте фабрику четвёртым аргументом:LinkedHashMap::newилиTreeMap::new; - переполнение: сумма больших чисел в
intмолча переполнится. Считайте вlongчерезmapToLongили сворачивайте черезMath::addExact, чтобы получить исключение вместо мусора.
Для размера списка значение пишется как e -> e.getValue().size(). Покажите и вариант без стримов: source.forEach((k, v) -> result.put(k, ...)) читается не хуже, и интервьюер оценит, что вы не держитесь за Stream API ради самого API.
Где спотыкаются
Не уточняют задачу и молча считают сумму. Интервьюер мог ждать количество элементов или максимум, и тогда верный код решает не ту задачу.
Берут Collectors.groupingBy вместо toMap. Группировать тут нечего, ключи уже есть, а groupingBy вернёт мапу со списками и потребует ещё одного прохода.
Забывают про null и пустые списки. Одна запись с null вместо списка роняет весь стрим, и это классический уточняющий вопрос.