如何使用java 8流和lambdas迭代和处理其值为元素列表的映射的值

Sar*_* MB 2 java functional-programming java-8

要点:我们试图尽可能用java 8流和lambdas重写旧的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));
Run Code Online (Sandbox Code Playgroud)

在这里,人们根据他们的名字的起始角色进行分组.

我想在地图中找到列表中每个键的平均年龄.

同样,我尝试过stackoverflow中提到的很多东西,但没有一个与我的案例匹配,或者很少在语法上不起作用.

提前致谢!

Jac*_* G. 5

你没有说明你希望如何(或者如果)存储年龄,所以我现在把它作为一个打印声明.然而,它就像迭代每个条目Map并打印每个条目的平均值一样简单List(在将Person对象映射到它们的年龄之后):

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

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

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

注意:-1如果不存在平均值,则返回,这假设在Person调用内存在getter方法getAge,返回a int.