finalList= resultList.stream()
    . filter(nestedDo -> nestedDo.getAttrib8() == 'S' &&
            nestedDo.getFirstChildList().stream()
            .filter(c ->
                    ("ST2".equals(c.getAttrib18()) ||
                     "ST3".equals(c.getAttrib18()) ||
                     "ST4".equals(c.getAttrib18())
                                                       &&
                         c.getGrandChildList() != null &&
                         c.getGrandChildList().stream()
                            .filter(gc ->
                            date.after(gc.getAttrib19()) &&
                            date.before(gc.getAttrib43())
                            )
                            .findAny().isPresent())
                            )
                            .findAny().isPresent())
                            .collect(Collectors.toList());


NestedCustomerDO50是由NestedFirstChildDO50继承的类,NestedFirstChildDO50由NestedGrandChildDO50继承。每个类都包含子类的列表(即NestedCustomerDO50包含NestedFirstChildDO50的列表,NestedFirstChildDO50包含NestedGrandChildDO50的列表)。每个类包含50个属性(attrib1-atrib50)。

resultList和finalList是NestedCustomerDO类型的对象的列表。

getFirstChildList()返回NestedFirstChildDO50类型的对象的arrayList
getGrandChildList()返回NestedGrandtChildDO50类型的对象的arrayList

这里的finalList包含基于所有级别过滤的过滤结果。但是,如果resultList根据第二和第三级的过滤结果(不为null)给出结果,我想将resultList作为finalList。因此,无论何时第二级和第三级过滤返回结果,我都希望获得具有完整子列表的父列表。

例如:如果NestedCustomerDO50保留客户详细信息,NestedFirstChildDO50保留地址详细信息,NestedGrandtChildDO50保留城市详细信息,则当我们通过上述代码进行搜索时,我们只会得到指定的过滤结果,但我希望所有客户详细信息包括所有地址(而不是指定的过滤地址)。

如有任何疑问,请添加为评论。

最佳答案

您的描述和您的代码一样神秘,但是据我了解,您只想知道是否存在匹配项,如果匹配,请使用整个原始列表和已过滤(然后为空)的列表。

这是了解anyMatch的正确点,它不仅可以解决您的任务,而且可以简化您的内部条件,因为您可以将.filter(element->condition).findAny().isPresent()替换为.anyMatch(element->condition)

List<?> finalList = resultList.stream()
  .anyMatch(nestedDo -> nestedDo.getAttrib8() == 'S' &&
    nestedDo.getFirstChildList().stream().anyMatch(c ->
          "ST2".equals(c.getAttrib18())
       || "ST3".equals(c.getAttrib18())
       || "ST4".equals(c.getAttrib18())
          && c.getGrandChildList()!=null
          && c.getGrandChildList().stream().anyMatch(gc ->
              date.after(gc.getAttrib19()) && date.before(gc.getAttrib43()))
  ))? resultList: Collections.emptyList();


请注意,尽管括号的位置对我来说很可疑,但我仍然按照您所提问题的最基本条件保持逻辑。

08-03 17:03