waters.stream().collect(Collectors.toMap(WaterNodePotentialRespVo::getNode, e->e,(k1, k2)-> { //返回最大值 return k1.getWater()>k2.getWater()?k1:k2; })).forEach((k,v)->{ WaterNodeCRespVo respVo = new WaterNodeCRespVo(); respVo.setNode(k); respVo.setMaxWaterDepth(v.getWater()); respVo.setMaxTm(v.getTm()); respVo finalRespVos.add(respVo); }); 中的map换成 group
时间: 2023-11-22 12:55:49 浏览: 95
如果你想用 group 来替换掉 toMap,可以使用 Collectors.groupingBy() 方法。这个方法可以将流中的元素分组,然后对每个分组进行操作。对于你的这个例子,你可以这样做:
```
waters.stream()
.collect(Collectors.groupingBy(WaterNodePotentialRespVo::getNode,
Collectors.maxBy(Comparator.comparing(WaterNodePotentialRespVo::getWater))))
.forEach((k, v) -> {
WaterNodeCRespVo respVo = new WaterNodeCRespVo();
respVo.setNode(k);
respVo.setMaxWaterDepth(v.get().getWater());
respVo.setMaxTm(v.get().getTm());
finalRespVos.add(respVo);
});
```
这里使用了 Collectors.groupingBy() 方法将流中的元素按节点分组。对于每个分组,我们使用 Collectors.maxBy() 方法获取节点的最大值。最后,我们遍历每个分组,将结果存储到 finalRespVos 中。
相关问题
waters.stream().collect(Collectors.toMap(WaterNodePotentialRespVo::getNode, e->e,(k1, k2)-> { //返回最大值 return k1.getWater()>k2.getWater()?k1:k2; })).forEach((k,v)->{ WaterNodeCRespVo respVo = new WaterNodeCRespVo(); respVo.setNode(k); respVo.setMaxWaterDepth(v.getWater()); respVo.setMaxTm(v.getTm()); respVo finalRespVos.add(respVo); }); 这里做了什么事情
这段代码使用了Java 8的Stream API,对WaterNodePotentialRespVo对象列表进行操作,实现了以下功能:
1. 将WaterNodePotentialRespVo对象列表转换为Map,其中键为节点对象,值为WaterNodePotentialRespVo对象本身。
```
.collect(Collectors.toMap(WaterNodePotentialRespVo::getNode, e->e,(k1, k2)-> {
//返回最大值
return k1.getWater()>k2.getWater()?k1:k2;
}))
```
这里用到了`Collectors.toMap()`方法,`WaterNodePotentialRespVo::getNode`表示将节点对象作为Map的键,`e->e`表示将WaterNodePotentialRespVo对象本身作为Map的值,`(k1, k2)-> {return k1.getWater()>k2.getWater()?k1:k2;}`表示如果出现重复的键,取值最大的那个。
2. 遍历Map,生成WaterNodeCRespVo对象,并将其加入到finalRespVos列表中。
```
.forEach((k,v)->{
WaterNodeCRespVo respVo = new WaterNodeCRespVo();
respVo.setNode(k);
respVo.setMaxWaterDepth(v.getWater());
respVo.setMaxTm(v.getTm());
respVo
finalRespVos.add(respVo);
});
```
这里用到了`Map.forEach()`方法,对Map中的每个键值对进行遍历,生成WaterNodeCRespVo对象并加入到finalRespVos列表中。
waters.stream() .collect(Collectors.groupingBy(WaterNodePotentialRespVo::getNode, Collectors.maxBy(Comparator.comparing(WaterNodePotentialRespVo::getWater)))) .forEach((k, v) -> { WaterNodeCRespVo respVo = new WaterNodeCRespVo(); respVo.setNode(k); respVo.setMaxWaterDepth(v.get().getWater()); respVo.setMaxTm(v.get().getTm()); finalRespVos.add(respVo); }); 并找到MaxWaterDepth第一次大于零
这段代码使用了Java 8中的Stream API,将一个WaterNodePotentialRespVo对象的集合按照节点分组,并取每个节点对应的最大水位值。然后将每个节点的最大水位值和时间戳设置到一个新的WaterNodeCRespVo对象中,并将其添加到一个最终结果集中。
要找到MaxWaterDepth第一次大于零,可以在forEach方法中加入一个变量来判断是否已经找到了第一次大于零的节点,如果找到了就直接返回,否则继续查找。示例代码如下:
```
boolean found = false;
for (Map.Entry<String, Optional<WaterNodePotentialRespVo>> entry : map.entrySet()) {
String node = entry.getKey();
WaterNodePotentialRespVo respVo = entry.getValue().get();
if (respVo.getWater() > 0 && !found) {
WaterNodeCRespVo cRespVo = new WaterNodeCRespVo();
cRespVo.setNode(node);
cRespVo.setMaxWaterDepth(respVo.getWater());
cRespVo.setMaxTm(respVo.getTm());
finalRespVos.add(cRespVo);
found = true;
}
}
```
这样就可以在遍历完整个集合之后,找到第一次MaxWaterDepth大于零的节点了。
阅读全文