我上课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<AB,Float> mapWithData
来计算我们在stats.log a
serviceName和b
servicePort中的服务器响应次数。
我们在地图servicesNamePort.merge(new AB(...,...), 1.0f, Float::sum)
如何从Map<AB,Float> mapWithData
创建地图,其中键为 b ,值为 a的地图为键,浮动为值表示{{1 }}
我尝试使用Map<String **(b)**, Map<String**(a)**,Float>>
,但我有这个答案:
Collectors.groupingBy
感谢您的帮助
答案 0 :(得分:3)
您错过的一点是,您可以指定另一个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
的直接支持。
但由于这个数字应该是 count ,所以我宁愿使用Integer
或Long
。
如果您的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))));