java - 使用 maxBy() 处理流时类型不匹配
问题描述
我正在编写一个代码来处理不同省份不同城市的山间小屋。我正在尝试计算每个海拔范围内单个山间小屋中可用床位的最大数量。如果山间小屋的高度不可用,我将使用其自治市的高度。我希望我的方法返回 aMap<String, Optional<Integer>>
但我得到一个Map <String , Optional<MountainHut>>
. 现在我知道我得到的 Optional 实际上是拥有最大床位数的人,但我正在努力获得正确的数据类型。
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 类的可选属性
正如预期的那样,错误消息如下:类型不匹配:无法从 Map> 转换为 Map>
解决方案
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.*
以摆脱样板。
推荐阅读
- android - Android - m3u8 视频流
- php - PHP 如何在我的邮件中包含一个 var?
- ios - 如何快速将 Internet 连接类型发送到服务器:Alamofire
- python - python3:循环遍历整个文件时再次执行for循环
- javascript - 与 javascript 中的文本框一起打印
- python - 如何使用嵌套的 for 循环迭代地附加表示空间 x 和 y 场景的数据框?
- php - 我怎样才能停止重复sql
- sql - 特定用户购买的所有产品
- r - 合并相同的列组合
- localhost - Firefox 通过 UNC 访问存储在本地计算机上的文件