Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用maxBy()处理流时类型不匹配_Java - Fatal编程技术网

Java 使用maxBy()处理流时类型不匹配

Java 使用maxBy()处理流时类型不匹配,java,Java,我正在写一个代码来处理不同省份不同城市的山地小屋。我试图计算每个海拔范围内单个山间小屋的最大可用床位数。如果山上小屋的高度不可用,我将使用 该市的海拔高度。 我希望我的方法返回一个映射,但我得到的是一个映射。现在我意识到,我得到的可选数据实际上是拥有最多床位的数据,但我正在努力获得正确的数据类型 public Map<String, Optional<Integer>> maximumBedsNumberPerAltitudeRange() { return th

我正在写一个代码来处理不同省份不同城市的山地小屋。我试图计算每个海拔范围内单个山间小屋的最大可用床位数。如果山上小屋的高度不可用,我将使用 该市的海拔高度。 我希望我的方法返回一个
映射
,但我得到的是一个
映射
。现在我意识到,我得到的可选数据实际上是拥有最多床位的数据,但我正在努力获得正确的数据类型

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))
            )
        );
}
公共地图最大化
{
返回此.getMountainHuts().stream()
.收集(
收藏家。分组依据((山间小屋)->
这是我的(
mountainHut.getAltitude().orElse(mountainHut.getUtilization().getAltitude())
),
收集器.maxBy(比较器.比较(MountainHut::getBedsNumber))
)
);
}
为了完整起见,我还将发布getAltituderAge方法,另一个 方法只是getter

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());
}
公共字符串getAltitudeRange(整数高度){
Range r=ranges.stream()
.filter((x)->高度>=x.getMin()| |高度到

Map>

maxBy
不转换,它只是比较。您提取的键(即床号)是
比较器的实现细节,而
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()))
            )
        );
}
公共地图最大化
{
返回此.getMountainHuts().stream()
.收集(
收藏家。分组依据((山间小屋)->
这是我的(
mountainHut.getAltitude().orElse(mountainHut.getUtilization().getAltitude())
),
Collectors.mapping(MountainHut::getBedsNumber,Collectors.maxBy(Comparator.naturalOrder()))
)
);
}

PS:在流密集型类中,您可以添加一个
导入静态java.util.stream.Collectors.*
以摆脱样板文件。

所考虑的山地小屋中的床位数您没有将MountainHut转换为整数。为什么您希望它返回整数?@Eran这是一个Integer@glee8e这正是我想说的,菲古如果退出,我无法将其转换为所需的类型(整数)@Eran是的,可选返回类型链接到maxBy方法非常感谢。我还有一个疑问,为什么我要在maxBy中指定naturalOrder而不是键作为排序键?因为
maxBy
是该
映射
收集器的下游收集器,它已经完成了e的工作提取键。换句话说,
maxBy
的输入已更改为床号。它不是在
MountainHut
s流上运行,而是在
Integer
流上运行(床号)