Java 8 - 条件分组地图条目

3

我有以下地图:

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”开头,则该条目应保持不变。

1个回答

6
您可以使用groupingBy(classifier, downstream)收集器来实现此操作。该收集器将按照键的第一个字符进行分类,downstream收集器则会应用于所有被分类到同一键下的值,其中averagingDouble是downstream收集器之一。
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}"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接