有条件地分组映射项-Java 8

有条件地分组映射项-Java 8,java,java-8,java-stream,Java,Java 8,Java Stream,我有以下地图: 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”开头,则条目应保持原样。您可以通过使用将根据密钥

我有以下地图:

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”开头,则条目应保持原样。

您可以通过使用将根据密钥的第一个字符进行分类的收集器来实现这一点,而下游收集器将应用于分类到同一密钥的所有值

publicstaticvoidmain(字符串[]args){
Map Map=newhashmap();
地图放置(“AB”,0.5);
地图放置(“AC”,0.7);
地图.put(“AD”,0.2);
地图.put(B,0.3);;
地图.put(C,0.9);;
映射结果=
map.entrySet()
.stream()
.collect(收集器.groupingBy(
e->e.getKey().charAt(0),
Collectors.averagingDouble(Map.Entry::getValue)
));
System.out.println(result);//打印“{A=0.466666,B=0.3,C=0.9}”
}
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}"
}