Java Фильтры Поиск самого дорогого дома в каждом городе - PullRequest
1 голос
/ 22 февраля 2020

У меня есть список домов в ряде городов. Я пытаюсь использовать фильтр, чтобы составить список самых дорогих домов в каждом городе. Я не могу использовать обычные циклы.

//This returns unique City Names
List unique = obList.stream()
    .map(x -> x.getCity())
    .distinct()
    .sorted()
    .collect(Collectors.toList());

//This returns the house with the highest price in that city
RAddress obReturn = obList.stream()
        .filter(x -> x.getCity().equalsIgnoreCase(sName))
        .sorted((x,y) -> (int)(y.getPrice() - x.getPrice()))
        .findFirst()
        .get();

Я понимаю, что объединение их каким-то образом необходимо для этой проблемы, но я не могу на всю жизнь понять, как ...

Любая помощь приветствуется.

1 Ответ

8 голосов
/ 22 февраля 2020

Используйте коллектор groupingBy, чтобы собрать все дома в каждом городе вместе; затем используйте нисходящий maxBy коллектор, чтобы сохранить только самый дорогой дом в каждом городе:

obList.stream()
    .collect(
        groupingBy(
            x -> x.getCity(),
            maxBy(comparing(x -> x.getPrice())))

Это возвращает Map<CityType, Optional<HouseType>> (где CityType и HouseType - независимо от типов городов и дома, соответственно.

Если вы хотите Map<CityType, HouseType> (то есть без Optional, поскольку вы знаете, что значение всегда присутствует), оберните нижестоящий коллектор:

collectingAndThen(maxBy(...), Optional::get)
...