我正在编写代码来处理不同省份不同城市的山区小屋。我正在尝试计算每个海拔范围内单个山区小屋中可用的最大床位数。如果山间小屋的海拔高度不可用,我将使用
自治市的海拔。
我想要我的方法返回Map<String, Optional<Integer>>,但是我得到了Map <String , Optional<MountainHut>>。现在我知道一个事实,即我得到的“可选”实际上是床位数最大的那个,但是我正在努力获取正确的数据类型。

public Map<String, Optional<Integer>> maximumBedsNumberPerAltitudeRange()
{
    return this.getMountainHuts().stream()
        .collect(
            Collectors.groupingBy((MountainHut mountainHut) ->
                this.getAltitudeRange(
                    mountainHut.getAltitude().orElse(mountainHut.getMunicipality().getAltitude())
                ),
                Collectors.maxBy(Comparator.comparing(MountainHut::getBedsNumber))
            )
        );
}


为了完整起见,我还将发布getAltitudeRange方法,另一个
方法只是吸气剂。

public String getAltitudeRange(Integer altitude) {
    Range r = ranges.stream()
        .filter((x) -> altitude>= x.getMin() || altitude <= x.getMax())
        .findFirst()
        .orElse(new Range(0,Integer.MAX_VALUE));
    ranges.stream().close();
    if(r.getMax() == Integer.MAX_VALUE)
    {
        return (0 +" - "+ "INF");
    }
    return (r.getMin() + " - " + r.getMax());
}


海拔高度是MountainHut类的Optional属性

如预期的那样,错误消息如下:
类型不匹配:无法从“地图”>转换为
 地图>

最佳答案

maxBy不会转换,它只是进行比较。您提取密钥(即床号)是Comparator的实现细节,而maxBy不知道。

您实际上非常亲密。您只需要在groupingBy和maxBy之间添加一个中间步骤。

public Map<String, Optional<Integer>> maximumBedsNumberPerAltitudeRange()
{
    return this.getMountainHuts().stream()
        .collect(
            Collectors.groupingBy((MountainHut mountainHut) ->
                this.getAltitudeRange(
                    mountainHut.getAltitude().orElse(mountainHut.getMunicipality().getAltitude())
                ),
                Collectors.mapping(MountainHut::getBedsNumber, Collectors.maxBy(Comparator.naturalOrder()))
            )
        );
}


PS:在流繁重的类中,您可以添加import static java.util.stream.Collectors.*来消除样板。

10-02 23:08