从地图获取平均值

时间:2018-02-17 11:12:39

标签: java lambda java-8 hashmap average

我正在尝试使用Java 8从Map获取平均值,但是我想获取Map.Entry而不是获取值本身。

double average = totals.entrySet()
                       .stream()
                       .mapToDouble(i -> i.getValue())
                       .average()
                       .orElse(0); //Want to get Map.Entry instead

1 个答案:

答案 0 :(得分:6)

你不能得到这样的条目,因为平均值甚至不需要是地图中的值。

例如,在地图中

{"A": 1, "B": 2}

平均值为1.5,这不是地图的值。在这种情况下,您希望获得哪个条目?

你可以做的是找到最接近平均值的第一个条目,如下:

Map<String, Integer> m = new HashMap<>();
m.put("A", 1);
m.put("B", 2);
m.put("C", 4);
// First, compute average
double average = m.values().stream().mapToDouble(Integer::doubleValue).average().orElse(0);
// Then, find entry closest to average
Map.Entry<String, Integer> e = m.entrySet().stream()
        .min(Comparator.comparing(a -> Math.abs(a.getValue() - average)))
        .orElse(null);