Java 过滤器查找每个城市中最昂贵的房子

0 java lambda filter java-stream

我有一些城市的房屋清单。我正在尝试使用过滤器来生成每个城市最昂贵的房子的列表。我无法使用传统循环。

//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();
Run Code Online (Sandbox Code Playgroud)

我知道以某种方式将这些结合起来对于解决这个问题是必要的,但我一生都无法弄清楚如何......

任何和所有的帮助表示赞赏。

And*_*ner 8

使用groupingBy收集器将每个城市的所有房屋收集在一起;然后使用下游maxBy收集器保留每个城市中最昂贵的房子:

obList.stream()
    .collect(
        groupingBy(
            x -> x.getCity(),
            maxBy(comparing(x -> x.getPrice())))
Run Code Online (Sandbox Code Playgroud)

这将返回 a Map<CityType, Optional<HouseType>>( whereCityTypeHouseTypeare 分别是城市和房屋的类型。

如果您想要 a Map<CityType, HouseType>(即没有Optional,因为您知道该值始终存在),请包装下游收集器:

collectingAndThen(maxBy(...), Optional::get)
Run Code Online (Sandbox Code Playgroud)

  • @user11376058 明确地说,如果您的城市是“String”类型并且价格是“,则上面的代码依赖于“Collectors”类的“静态导入”,返回类型为“Map &lt;String,Optional &lt;Integer &gt;&gt;”整数`. (2认同)