从迭代器到Java 8流的转换
私有无效应用程序查询条件(列表结果列表, 列表(最终列表){
ListIterator<NestedCustomerDO50> iterator = resultList.listIterator();
for (; iterator.hasNext();) {
NestedCustomerDO50 nestedDo = iterator.next();
if ('S' == nestedDo.getAttrib8()) {
for (NestedFirstChildDO50 child : nestedDo.getFirstChildList()) {
if (("ST2".equals(child.getAttrib18()))
|| ("ST3".equals(child.getAttrib18()))
|| ("ST4".equals(child.getAttrib18()) || (!"ST"
.equals(child.getAttrib18())))) {
if (null != child.getGrandChildList()) {
for (NestedGrandChildDO50 grandChild : child
.getGrandChildList()) {
if ((date.after(grandChild.getAttrib19()) && date
.before(grandChild.getAttrib43()))) {
finalList.add(nestedDo);
}
}
}
}
}
}
}
}
我想将以下代码转换为Java8流。但我发现了困难。 NestedCustomerDO50是一个类,由NestedFirstChildDO50继承,NestedGrandChildDO50继承。每个类都包含子类的列表(即NestedCustomerDO50包含NestedFirstChildDO50的列表,NestedFirstChildDO50包含NestedGrandChildDO50的列表)。每个类包含50个属性(attrib1-atrib50)
List<NestedGrandChildDO50> testS = resultList.stream()
.filter(v1 -> v1.getAttrib8() == 'S')
.flatMap(value -> value.getFirstChildList().stream())
.filter(value -> "ST2".equals(value.getAttrib18())
|| "ST3".equals(value.getAttrib18()) || "ST4".equals(value.getAttrib18()) ||!("ST".equals(value.getAttrib18())))
.flatMap(value -> value.getGrandChildList().stream())
.filter( val2 -> (date.after(val2.getAttrib19())) && (date.before(val2.getAttrib43())))
.collect(Collectors.toList());
这是我唯一的孙子孙女名单。但我希望ParentObject列表满足这些条件。有没有办法做到这一点。请解释如何使用代码执行此操作
# 1 楼答案
使用流API的过滤方法。
nestedDO.getFirstChildList().stream().filter(c -> { String attr18 = c.getAttrib18(); ...//your comparison }).forEach(c -> { ...//do something with the matching children });
由于您的方法多次将nestedDo添加到finalList,因此我已经更正了这一点。现在,每个匹配的nestedo只添加一次