2016-03-04 66 views
3

我有以下地图:有条件组映射条目 - Java的8

AB -> 0.5 
AC -> 0.7 
AD -> 0.2 
B -> 0.3 
C -> 0.9 

,现在我想把它映射到这一点,最好使用Java 8:

A -> (0.5 + 0.7 + 0.2)/3 
B -> 0.3 
C -> 0.9 

我已经尝试了组合的收藏家和计算机,但永远不会到达那里。如果他们的第一个字符是'A'并且该值应该是该组的平均值,那么键应该被分组。如果密钥没有以'A'开始,则该条目应保持原样。

回答

5

您可以通过使用groupingBy(classifier, downstream)收集器来完成此操作,该收集器将根据密钥的第一个字符进行分类,并且应用于归入同一个密钥的所有值的下游收集器将为averagingDouble

public static void main(String[] args) { 
    Map<String, Double> map = new HashMap<>(); 
    map.put("AB", 0.5); 
    map.put("AC", 0.7); 
    map.put("AD", 0.2); 
    map.put("B", 0.3); 
    map.put("C", 0.9); 

    Map<Character, Double> result = 
     map.entrySet() 
      .stream() 
      .collect(Collectors.groupingBy(
      e -> e.getKey().charAt(0), 
      Collectors.averagingDouble(Map.Entry::getValue) 
      )); 

    System.out.println(result); // prints "{A=0.4666666666666666, B=0.3, C=0.9}" 
}