首页 > 解决方案 > 如何使用 java 8 流和 lambda 迭代和处理其值是元素列表的映射的值

问题描述

要点:我们正在尝试尽可能使用 java 8 流和 lambda 重写我们的旧 java 代码。

问题:我有一个映射,其键是字符串,值是用户定义对象的列表。

Map<String, List<Person>> personMap = new HashMap<String, List<Person>>();
personMap.put("A", Arrays.asList(person1, person2, person3, person4));
personMap.put("B", Arrays.asList(person5, person6, person7, person8));

在这里,这些人是根据他们名字的起始字符进行分组的。

我想为地图中的每个键找到列表中人员的平均年龄。

同样,我尝试了 stackoverflow 中提到的许多事情,但没有一个与我的案例匹配,或者很少有语法不起作用。

提前致谢!

标签: javajava-8functional-programming

解决方案


您没有指定您希望如何(或是否)存储年龄,所以我现在将其作为打印声明。尽管如此,它就像迭代中的每个条目Map并打印每个条目的平均值一样简单List(在将对象映射Person到它们的年龄之后):

personMap.forEach((k, v) -> {
    System.out.println("Average age for " + k + ": " + v.stream().mapToInt(Person::getAge).average().orElse(-1));
});

如果您想将它存储在另一个Map中,那么您可以很容易地将它收集到一个中:

personMap.entrySet()
         .stream()
         .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()
                                                            .stream()
                                                            .mapToInt(Person::getAge)
                                                            .average()
                                                            .orElse(-1)));

注意:如果不存在平均值则返回,并且假定在被调用中-1存在 getter 方法,返回一个.PersongetAgeint


推荐阅读