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继承的类,由NestedGrandChildDO50继承。每个类包含子类的List(即NestedCustomerDO50包含NestedFirstChildDO50的列表,NestedFirstChildDO50包含NestedGrandChildDO50的List)。每个类包含50个属性(attrib1-atrib50)。
resultList和finalList是NestedCustomerDO类型的对象列表。
getFirstChildList()返回NestedFirstChildDO50类型的对象的arrayList getGrandChildList()返回NestedGrandtChildDO50类型对象的arrayList
此处,finalList包含基于所有级别的过滤的过滤结果。但是如果resultList根据第二和第三级别的过滤给出结果(非空),我想将resultList作为finalList。因此,每当第二级和第三级过滤返回结果时,我想获得具有完整子列表的父列表。
例如:如果NestedCustomerDO50保存客户详细信息而NestedFirstChildDO50保存地址详细信息而NestedGrandtChildDO50保存City详细信息,当我们通过上面的代码搜索它时,我们只获得指定的过滤结果,但我想要所有客户详细信息,包括所有地址(不是指定的过滤地址) )。
如果对问题有任何疑问,请添加评论。
答案 0 :(得分:1)
您的描述与您的代码一样神秘,但据我了解,您只想知道是否有匹配,如果是,请使用整个原始列表和过滤(然后为空)列表。
这是了解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();
请注意,我保持最内层条件的逻辑与您的问题完全一致,尽管支架位置对我来说很可疑。