1. Получить уникальные имена активных элементов
Условие задачи:
Дан список объектов Item.
Необходимо с помощью Stream API получить коллекцию уникальных имён (Item.name) только тех элементов, у которых active = true.
Код:
@Getter
@Setter
class Item {
private final Long id;
private String name;
private boolean active;
public Item(Long id) {
this.id = id;
}
}
List<Item> items = ...;
Collection<String> result = items.stream()...;
Спойлеры к решению
Подсказки
💡 Через
💡 Через
💡 Для получения уникальных значений собери результат в
filter() оставь только активные элементы.💡 Через
map() преобразуй Item в его имя.💡 Для получения уникальных значений собери результат в
Set.Решение
Collection<String> result = items.stream()
.filter(Item::isActive)
.map(Item::getName)
.collect(Collectors.toSet());
Сначала:
.filter(Item::isActive)
оставляет только элементы с active = true.
Затем:
.map(Item::getName)
преобразует каждый Item в его имя.
Наконец:
.collect(Collectors.toSet())
собирает имена в Set, поэтому повторяющиеся значения автоматически исключаются.
Если порядок элементов важен, можно собрать результат в LinkedHashSet:
Collection<String> result = items.stream()
.filter(Item::isActive)
.map(Item::getName)
.collect(Collectors.toCollection(LinkedHashSet::new));
Временная сложность в среднем — O(n), дополнительная память — O(k), где k — количество уникальных имён активных элементов.