提问人:Jameson_uk 提问时间:11/9/2023 最后编辑:Jameson_uk 更新时间:11/10/2023 访问量:68
使用 Java Streams 根据孙子属性过滤列表
Using Java Streams to filter list based on grandchildren attributes
问:
问题
我想使用流根据层次结构的底层是否存在实例来过滤列表。
所以我有 -> -> ->,我希望能够过滤掉它,以包括至少一个子组不包含任何 30 岁以下的人的条目。如果满足这个标准,我想保留它。List<Summary>
Group
Summary
Person
Summary
理想情况下,我想使用普通的 Java,但由于托管的应用程序,我被困在 JDK-8 上。我似乎无法找出嵌套流以实现此目的的正确方法。
我已经走到了这一步,但它错过了没有子组或子组中没有人的情况,我不完全相信这是正确的逻辑
summaries.stream()
.filter (s -> s.getGreoup().getSubGroups.stream()
.anyMatch(sg -> sg.getPeople.stream()
.noneMatch(p -> p.getAge() < 30)))
.collect(Collectors.toList());
类
我有我想过滤的东西,这分解为List<Summary>
public class Summary {
Group aGroup;
Long numPeople;
String manager;
}
其中有多个实例。
然后我有List
public Class Group {
List<SubGroup> subGroups;
//...
}
public Class SubGroup {
List<Person> people;
//...
}
public class Person {
String name;
int age;
//...
}
答:
2赞
MoxxiManagarm
11/9/2023
#1
喜欢这个?
Predicate<SubGroup> isU30OnlySubGroup = subGroup ->
subGroup.getPeople().stream().allMatch(person -> person.getAge() >= 30);
Predicate<Summary> hasU30OnlySubGroup = summary ->
summary.getGroup().getSubGroups().stream().anyMatch(isU30OnlySubGroup);
List<Summary> filteredSummaries =
summaries.stream().filter(hasU30OnlySubGroup).collect(Collectors.toList());
评论
1赞
Jameson_uk
11/9/2023
需要一个额外的谓词和一个或来迎合没有子组的组,但这有很大帮助。谢谢
评论