【发布时间】:2020-03-23 21:35:42
【问题描述】:
我有三个对象:
- 人
- 爱好
- 类型
Person.java:
public class Person
{
private String name;
private List<Hobby> hobbyList = new ArrayList<>();
...
}
爱好.java:
public class Hobby
{
private String name;
private Person person;
private Type type;
...
}
Type.java:
public class Type
{
private String name;
private List<Hobby> hobbyList = new ArrayList<>();
...
}
Person 和 Hobby 之间是 1:m 关系,Type 和 Hobby 之间是 1:m 关系。
现在,我的问题是,我想使用 lambda 表达式过滤人员列表。只有具有特定类型的爱好的人才能在列表中。
我需要遍历这些人,以获取个人爱好列表,并且需要检查爱好是否具有特定类型。
如果没有 lambda 表达式,我将过滤以下列表:
List<Person> filteredList = new LinkedList<>();
for (Person p : persons)
{
for (Hobby h : p.getHobbyList())
{
if(h.getType.getName.equals("Ball"))
{
if(!filteredList.contains(p))
{
filteredList.add(p);
}
}
}
}
【问题讨论】:
-
为什么会有从爱好到人的反向引用?如果 X 个人有相同的爱好怎么办?相反,我建议 Person ->* Hobby *1 Type
-
一种方法,您可以获得所有涉及名称“Ball”类型的有兴趣的人,例如:
List<Person> typeListMap = persons.stream() .flatMap(p -> p.getHobbyList() .stream() .map(h -> Map.entry(h.getType().getName(), p))) .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList()))) .get("Ball");。请注意,此处创建的中间Map会根据人们的爱好类型为您提供一个映射。