使用 Java Streams 根据孙子属性过滤列表

Using Java Streams to filter list based on grandchildren attributes

提问人:Jameson_uk 提问时间:11/9/2023 最后编辑:Jameson_uk 更新时间:11/10/2023 访问量:68

问:

问题

我想使用流根据层次结构的底层是否存在实例来过滤列表。 所以我有 -> -> ->,我希望能够过滤掉它,以包括至少一个子组不包含任何 30 岁以下的人的条目。如果满足这个标准,我想保留它。List<Summary>GroupSummaryPersonSummary

理想情况下,我想使用普通的 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;
  //...
}
java-stream

评论

0赞 daniu 11/9/2023
但是,如果子组中没有人员,则该子组不包含任何 30 岁以下的人。我建议你分解每个需求并单独检查它们,而不是一次性将它们全部内联到一个流中。

答:

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
需要一个额外的谓词和一个或来迎合没有子组的组,但这有很大帮助。谢谢