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 — количество уникальных значений.