Пройти по коллекции и вывести уникальные значения городов

8. Вывести города и получить уникальные названия

Условие задачи:
Дан список объектов City.

Необходимо:

  1. пройти по коллекции и вывести названия всех городов;

  2. с помощью 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 — количество уникальных названий городов.