Java 8 从地图创建地图
我有班Java 8 从地图创建地图,java-8,java-stream,Java 8,Java Stream,我有班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
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() {...}
}
现在,我创建mapmapWithData
来计算stats.loga
serviceName和b
servicePort中的服务器响应次数
我们在mapservicesNamePort.merge(新AB(…,…),1.0f,Float::sum)中求和它。
如何从map-mapWithData
创建地图,其中key是b,value是map ofa作为key,float作为value这意味着map
我尝试使用收集器。groupingBy
,但我有以下答案:
Map<String, List<Map.Entry<AB, Float>>> collect = mapWithData.entrySet()
.stream()
.collect(Collectors.groupingBy(abEntry-> abEntry.getKey().getB()));
Map collect=mapWithData.entrySet()
.stream()
.collect(Collectors.groupingBy(abEntry->abEntry.getKey().getB());
感谢您的帮助您错过的一点是,您可以指定另一个
收集器
作为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
结果,您可以使用
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))));
Map collect=mapWithData.entrySet()
.stream()
.collect(collector.groupingBy(e->e.getKey().getB(),
Collectors.groupingBy(e->e.getKey().getA(),
收藏,收藏,然后(
Collectors.summingDouble(e->e.getValue(),Double::floatValue));
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))));