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() {...}
}
现在,我创建map
mapWithData
来计算stats.log
a
serviceName和
b
servicePort中的服务器响应次数

我们在map
servicesNamePort.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))));