有 Java 编程相关的问题?

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

使用Java8流API对嵌套列表进行筛选

我无法将下面的代码片段转换为Java8流格式

List<String> titles = Arrays.asList("First Name", "Last Name");

for (FirstClass first : firstClassList) {
    for (SecondClass second : first.getSecondClassList()) {
        for (ThirdClass third : second.getThirdClassList()) {                   

            if(!titles.contains(third.getField())) {
                second.getThirdClassList().remove(third);
            }

        }
    }
}  

我将三级嵌套列表对象与字段的输入列表进行比较。如果字段不匹配,那么我将从原始列表中删除它们。 如何使用Java8语法实现这一点

编辑:我想返回头等舱的名单


共 (2) 个答案

  1. # 1 楼答案

    我认为在这种情况下,streams不会给你带来任何好处。你所要做的就是迭代嵌套列表,增强的for循环或^{}更简单

    改进可以来自使用^{}修改列表,也可能来自将拒绝逻辑移出循环:

    Predicate<ThirdClass> reject = third -> !titles.contains(third.getField());
    
    firstClassList.forEeach(first ->
        first.getSecondClassList().forEach(second ->
            second.getThirdClassList().removeIf(reject)
        )
    );
    
  2. # 2 楼答案

    首先,可以使用^{}^{}得到一个包含ThirdClassStreamList。要删除与条件匹配的项,可以使用^{},它将从与给定条件匹配的集合中删除所有项:

    firstClassList.stream()                         // Stream<FirstClass>
            .map(FirstClass::getSecondClassList)    // Stream<List<SecondClass>>
            .flatMap(Collection::stream)            // Stream<SecondClass>
            .map(SecondClass::getThirdClassList)    // Stream<List<ThirdClass>>
            .forEach(thirdList -> thirdList.removeIf(third -> !titles.contains(third.getField())));
    

    这将修改原始列表,就像您在示例中所做的那样。然后可以使用firstClassList作为进一步处理的结果

    除此之外,我建议您在标题中使用^{}而不是List<String>,因为它的时间复杂度是O(1)而不是O(n)

    Set<String> titles = new HashSet<>(Arrays.asList("First Name", "Last Name"));