如何只用Streams实现这个方法?

How to realize this method only with Streams?

    /**
     * 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() returns 列表 <"String">。城市名称。

方法“int getDistance(String srcCityName, String destCityName)”returns srcCityName 和 srcCityName 之间的距离。

PS: class 内禁止使用循环、迭代器。只能使用接受谓词的流和方法。您不能在 class.

中声明其他字段

这是我的作业)

if (citiesNames().contains(cityName) {
    return citiesNames().stream()
                        .filter(city -> getDistance(cityName, city) <= radius)
                        .collect(Collectors.toList());
}
else {
    throw new IllegalArgumentException(cityName + " not found.");
}

filter 方法 returns 仅包含邻近城市的流。
collect 方法创建一个 List 包含过滤流中的所有元素。

使用单独的 类 来存储 cityNamedistance 怎么样? 这将为您提供 有序 radius 更接近目标城市的所有城市的列表。

private final Set<String> cityNames = Set.of();

public List<String> getCitiesNear(String cityName, int radius) {
    class CityDistance {

        final String cityName;
        final int distance;

        public CityDistance(String cityName, int distance) {
            this.cityName = cityName;
            this.distance = distance;
        }

    }

    return cityNames.stream()
                    .map(curCityName -> new CityDistance(cityName, getDistance(cityName, curCityName)))
                    .filter(cityDistance -> cityDistance.distance <= radius)
                    .sorted(Comparator.comparingInt(one -> one.distance))
                    .map(cityDistance -> cityDistance.cityName)
                    .collect(Collectors.toList());
}

private int getDistance(String cityNameOne, String cityNameTwo) {
    return 0;
}