8. Вывести города и получить уникальные названия
Условие задачи:
Дан список объектов City.
Необходимо:
пройти по коллекции и вывести названия всех городов;
с помощью Stream API получить уникальную коллекцию строк с названиями городов.
Код:
public class Main {
public static void main(String[] args) {
List<City> cities = getCity();
// Код сюда
}
private static List<City> getCity() {
return List.of(
new City("msk"),
new City("msk"),
new City("spb"),
new City("ekb")
);
}
public static class City {
private final String name;
public City(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
}
Спойлеры к решению
Подсказки
💡 Для вывода элементов можно использовать
💡 Через
💡 Для получения уникальной коллекции удобно использовать
💡 Если важно сохранить порядок появления городов, используй
forEach().💡 Через
map(City::getName) преобразуй объекты City в строки.💡 Для получения уникальной коллекции удобно использовать
Set.💡 Если важно сохранить порядок появления городов, используй
LinkedHashSet.Решение
public static void main(String[] args) {
List<City> cities = getCity();
// 1. Вывести названия всех городов
cities.stream()
.map(City::getName)
.forEach(System.out::println);
// 2. Получить уникальные названия с сохранением порядка
Set<String> uniqueNames = cities.stream()
.map(City::getName)
.collect(Collectors.toCollection(LinkedHashSet::new));
System.out.println("Уникальные города:");
uniqueNames.forEach(System.out::println);
}
Сначала:
.map(City::getName)
преобразует поток объектов City в поток названий городов.
Во второй части результат собирается в:
Collectors.toCollection(LinkedHashSet::new)
LinkedHashSet одновременно:
удаляет дубликаты;
сохраняет порядок первого появления элементов.
Для исходных данных вывод будет таким:
msk
msk
spb
ekb
Уникальные города:
msk
spb
ekb
Дополнительный вызов distinct() перед сбором в Set не требуется, поскольку множество уже обеспечивает уникальность.
Временная сложность в среднем — O(n), дополнительная память — O(k), где k — количество уникальных названий городов.