Как реализовать данный метод при помощи стримов?

/**
     * Get all cities near current city in radius.
     *
     * @param cityName - city
     * @param radius   - radius in kilometers for search
     * @throws IllegalArgumentException if city with cityName city doesn't exist.
     */
    public List<String> getCitiesNear(String cityName, int radius) {

        List<String> nearCities = new ArrayList<>();

        List<Integer> distances = new ArrayList<>();
        for (int i = 0; i < this.citiesNames().size(); i++) {
            distances.add(this.getDistance(cityName, this.citiesNames().get(i)));

        }

        for (int i = 0; i < distances.size(); i++) {
            if (distances.get(i) <= radius) {
                if (!this.citiesNames().get(i).equals(cityName)) {
                    nearCities.add(this.citiesNames().get(i));
                }
            }
        }

        return nearCities;
    }

Метод citiesNames() возвращает List<"String">. Список имен городов.

Метод int getDistance(String srcCityName, String destCityName) возвращает расстояние между srcCityName и srcCityName.

Запрещено использовать циклы, итераторы внутри данного класса. Можно использовать только streams и методы принимающие предикаты. Нельзя объявлять другие поля в классе.


Ответы (2 шт):

Автор решения: Igor

Я Вам код писать не буду, а дам алгоритм, который приведет Вас к победе.

  1. Читаете про Stream API, смотрите примеры кодa, делаете простые вещи.
  2. Выполняете задание из Вашего вопроса.
  3. Получаете ошибки - компиляции, выполнения, неправильные результаты.
  4. Смотрите на эти ошибки, и через мозговые усилия пытаетесь понять в чем дело.
  5. Приходите на этот сайт и задаете конкретный вопрос про то, что у Вас не получилось.
→ Ссылка
Автор решения: Alex Rudenko

Несколько более конкретные советы по переписыванию кода с использованием Stream API:

  1. Для данной задачи достаточно будет использовать промежуточную операцию Stream::filter, чтобы исключить заданный город и найти города для заданного радиуса, и простой коллектор Collectors.toList() для получения списка результатов.
  2. Исходный стрим нужно будет взять для списка городов this.citiesNames()

Готовое решение (тело метода) getCitiesNear займёт 3-4 строки с учётом форматирования кода.

→ Ссылка