gpt4 book ai didi

java-8 - 从 map 创建 map

转载 作者:行者123 更新时间:2023-12-01 01:53:07 25 4
gpt4 key购买 nike

我有课AB :

class AB{
private final String a;
private final String b;

public AB(String a, String b) {
this.a = a;
this.b = b;
}

public String getB() {
return b;
}

public String getA() {
return a;
}

@Override
public boolean equals(Object o) {...}

@Override
public int hashCode() {...}
}

现在,我创建 map Map<AB,Float> mapWithData计算 stats.log 中服务器响应的次数 a服务名称和 b服务端口。

我们在 map 中总结它 servicesNamePort.merge(new AB(...,...), 1.0f, Float::sum)
如何从 Map<AB,Float> mapWithData 创建 map 其中关键是 b 值是 的 map a 作为键,浮点数作为值 意思是 Map<String **(b)**, Map<String**(a)**,Float>>
我尝试使用 Collectors.groupingBy但我有这个答案:
Map<String, List<Map.Entry<AB, Float>>> collect = mapWithData.entrySet()
.stream()
.collect(Collectors.groupingBy(abEntry-> abEntry.getKey().getB()));

谢谢你的帮助

最佳答案

您错过的一点是,您可以指定另一个 Collector作为 groupingBy 的第二个参数收集器指定如何收集组:

Map<String, Map<String, Double>> collect = mapWithData.entrySet()
.stream()
.collect(Collectors.groupingBy(e -> e.getKey().getB(),
Collectors.groupingBy(e -> e.getKey().getA(),
Collectors.summingDouble(e -> e.getValue()))));

这是最接近你的问题,你可以得到,因为没有直接支持 Float .

但由于这个数字应该是一个计数,我宁愿使用 IntegerLong反正。

如果您的 mapWithData被声明为 Map<AB,Long> ,你可以使用
Map<String, Map<String, Long>> collect = mapWithData.entrySet()
.stream()
.collect(Collectors.groupingBy(e -> e.getKey().getB(),
Collectors.groupingBy(e -> e.getKey().getA(),
Collectors.summingLong(e -> e.getValue()))));

如果它真的必须是 Float结果,你可以使用
Map<String, Map<String, Float>> collect = mapWithData.entrySet()
.stream()
.collect(Collectors.groupingBy(e -> e.getKey().getB(),
Collectors.groupingBy(e -> e.getKey().getA(),
Collectors.collectingAndThen(
Collectors.summingDouble(e->e.getValue()), Double::floatValue))));

关于java-8 - 从 map 创建 map ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42699282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com