有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从迭代器到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) 个答案

  1. # 1 楼答案

    使用流API的过滤方法。 nestedDO.getFirstChildList().stream().filter(c -> { String attr18 = c.getAttrib18(); ...//your comparison }).forEach(c -> { ...//do something with the matching children });

    resultList.stream().
         filter(nestedDo -> nestedDo.getAttrib8() == 'S').
         filter(nestedDo ->  
             nestedDo.getFirstChildList().stream().anyMatch(c -> 
                 ("ST2".equals(c.getAttrib18()) || 
                 "ST3".equals(c.getAttrib18()) || 
                 "ST4".equals(c.getAttrib18()) || 
                 !"ST".equals(c.getAttrib18())) &&
                 c.getGrandChildList() != null &&
                 c.getGrandChildList().stream().anyMatch(gc -> {
                       date.after(gc.getAttrib19()) &&
                       date.before(gc.getAttrib43())
                 }))
             ))).
         forEach(finalList.add(nestedDo));
    

    由于您的方法多次将nestedDo添加到finalList,因此我已经更正了这一点。现在,每个匹配的nestedo只添加一次