我有以下地图:
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'开头,则该条目应保持原样。
答案 0 :(得分:5)
您可以使用将根据密钥的第一个字符进行分类的groupingBy(classifier, downstream)
收集器以及应用于分类到相同密钥的所有值的下游收集器{@ 3}}来实现此目的。
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}"
}