【问题标题】:Filter a list with condition on inner list过滤具有内部列表条件的列表
【发布时间】:2017-11-02 05:56:36
【问题描述】:

我有一个对象列表。每个对象都包含另一个列表。我想用内部列表的条件过滤列表。

例如:

有一个工厂列表。每个工厂都包含其生产的不同车型的列表。 我想过滤工厂列表,只得到生产 Mazda3 的工厂。

我如何使用 lambda 来做到这一点?

应该是这样的:

factories.stream().filter(f -> f.getCars().stream().filter(c -> C.getName().equals("Mazda3")).).collect(Collectors.toList());

【问题讨论】:

    标签: java list lambda java-8


    【解决方案1】:

    如果我理解正确(并简化了你的例子)

     List<List<Integer>> result = Arrays.asList(
                           Arrays.asList(7), 
                           Arrays.asList(1, 2, 3), 
                           Arrays.asList(1, 2, 4), 
                           Arrays.asList(1, 2, 5))
                .stream()
                .filter(inner -> inner.stream().anyMatch(x -> x == 5))
                .collect(Collectors.toList());
    
        System.out.println(result); // only the one that contains "5"[[1,2,5]] 
    

    编辑

    看到您的示例后,您正在寻找anyMatch

    【讨论】:

    • 谢谢尤金!
    【解决方案2】:

    这是应该做的事情:

    factories.stream()
             .filter(factory -> factory.getCars().stream()
                               .anyMatch(car -> searchedName.equals(car.getName())))
             .collect(Collectors.toList())
    

    但如果你可以在你的工厂类中添加一个特定的方法,那将是更好的设计:

    factories.stream()
             .filter(factory -> factory.hasProduced(model))
             .collect(Collectors.toList())
    

    另请参阅"runnable" example online——因为它仅表明方法通过了编译,而不是包含数据的完整演示,但您可以在自己的代码中自己完成,所以...;)

    【讨论】:

    • 我喜欢你的第二种方法。
    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 2018-01-24
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多