【问题标题】:Using Java 8 Streams for hiearchy of classes使用 Java 8 Streams 进行类层次结构
【发布时间】:2015-03-18 14:02:37
【问题描述】:
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 继承。每个类都包含子类的列表(即 NestedCustomerDO50 包含 NestedFirstChildDO50 的列表,NestedFirstChildDO50 包含 NestedGrandChildDO50 的列表)。每个类包含 50 个属性(attrib1-atrib50)。

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

getFirstChildList() 返回 NestedFirstChildDO50 类型对象的数组列表 getGrandChildList() 返回 NestedGrandtChildDO50 类型对象的数组列表

这里的finalList包含基于所有级别过滤的过滤结果。但是,如果 resultList 基于第二级和第三级的过滤给出结果(非空),我想将 resultList 作为 finalList 。因此,每当第二级和第三级过滤返回结果时,我都想获得带有完整子列表的父列表。

例如:如果 NestedCustomerDO50 包含客户详细信息,NestedFirstChildDO50 包含地址详细信息,NestedGrandtChildDO50 包含城市详细信息,当我们通过上面的代码搜索时,我们只得到指定的过滤结果,但我想要所有客户详细信息,包括所有地址(不是指定的过滤地址)。

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

【问题讨论】:

  • 您不应该根据混淆代码提出问题。您在谈论“客户详细信息”、“城市详细信息”等,但我们在您的代码中看到的只是ChildListGrandChildList 中的getAttrib18getAttrib19getAttrib43。我们应该如何知道该代码中的客户或城市是什么?

标签: java java-8


【解决方案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();

请注意,尽管大括号的位置对我来说看起来很可疑,但我保留了最里面条件的逻辑与您的问题完全相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2011-10-03
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 2014-05-16
    相关资源
    最近更新 更多