Уникальные значения на складах

7. Получить уникальные значения со всех складов

Условие задачи:
Дана карта складов Map<String, List<String>> storage, где:

  • ключ — название склада;

  • значение — список номеров, находящихся на этом складе.

Необходимо с помощью Stream API получить все уникальные номера со всех складов.

Код:

Map<String, List<String>> storage = new HashMap<>();

storage.put("s1", Arrays.asList("555-1123", "555-3389"));
storage.put("s2", Arrays.asList("555-1123", "555-5264"));
storage.put("s3", Arrays.asList("555-6654", "555-3242"));

Спойлеры к решению

Подсказки
💡 Через storage.values() получи списки значений всех складов.
💡 С помощью flatMap() объедини несколько списков в один поток строк.
💡 Для получения уникальных значений можно собрать результат в Set.

Решение
Set<String> uniqueNumbers = storage.values().stream()
        .flatMap(List::stream)
        .collect(Collectors.toSet());

Сначала:

storage.values().stream()

создаёт поток списков:

Stream<List<String>>

Затем:

.flatMap(List::stream)

разворачивает их в один поток номеров:

Stream<String>

После этого:

.collect(Collectors.toSet())

собирает значения в Set, который автоматически исключает дубликаты.

Если нужно сразу вывести уникальные номера, можно использовать distinct():

storage.values().stream()
        .flatMap(List::stream)
        .distinct()
        .forEach(System.out::println);

Для приведённых данных будут получены значения:

555-1123
555-3389
555-5264
555-6654
555-3242

Порядок вывода не гарантирован, поскольку исходная карта — HashMap.

Временная сложность в среднем — O(n), дополнительная память — O(k), где k — количество уникальных значений.