Java8按列表的各个元素分组
class Person {
String personName;
List<Skill> skills;
}
class Skill {
String skillName;
}
如何获取地图
- 技能名和人名
- skillName和person对象
约翰有绘画、功夫等技能。詹姆斯有烹饪,空手道,功夫,克里斯有绘画,徒步旅行
输出
painting -> John, Chris
kungfu -> John, James
cooking -> James
karate -> James
hiking -> Chris
我所尝试的:
list.stream().collect(Collectors.groupingBy(e -> e.skills.stream(), Collectors.toSet()))
我知道这是行不通的,因为你不能按e.skills分组。流()
list.stream().flatMap(e -> e.skills.stream()).collect(Collectors.groupingBy(e -> e.skillName, Collectors.toSet()));
它确实按技能名称分组(但仅限于技能对象),但由于flatMap,对Person的引用丢失
# 1 楼答案
我认为,如果您首先将
List<Person>
转换为Stream<PersonNameSkill>
,其中PersonNameSkill
表示一个包含Person
名称和一个归属于它们的Skill
的标称元组,那么这将更容易实现在Java 14中,您可以利用
record
来创建这个标称元组:既然有了它,您就可以编写一个解决方案(Java 8+):
如果您使用的是旧版本的Java,则可以使用以下工具创建
PersonNameSkill
:# 2 楼答案
您可以为每个
Skill_name->Person_name
组合创建Map.Entry对象,然后使用Collectors.groupingBy将人名与技能分组