java - 如何使用 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 中提到的许多事情,但没有一个与我的案例匹配,或者很少有语法不起作用。
提前致谢!
解决方案
您没有指定您希望如何(或是否)存储年龄,所以我现在将其作为打印声明。尽管如此,它就像迭代中的每个条目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 方法,返回一个.Person
getAge
int
推荐阅读
- android - 在android中通过代码开启耳机模式
- android - 在空的 EditText 上检测退格键
- php - print_r() 函数显示值,但我无法访问它们的条件
- python - python3中else语句的语法无效
- swift - SpriteKit 在跨设备的视图框架内生成对象
- java - 我可以创建一个实体映射到具有来自实体特定属性的名称的表吗?
- javascript - 使用 onclick 交换图像
- javascript - 将项目与视图组件的右侧对齐?
- windows - 我想在批处理文件中使用 for 循环从用户那里获得很多输入
- apache-spark - 按字段对 Spark 数据帧进行重复数据删除