从地图创建地图

时间:2017-03-09 15:30:12

标签: 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 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

感谢您的帮助

1 个答案:

答案 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 ,所以我宁愿使用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))));
相关问题