在内部列表中筛选具有条件的列表

Yur*_*uri 8 java lambda list java-8

我有一个对象列表.每个对象包含另一个列表.我想在内部列表中使用条件过滤列表.

例如:

有一份工厂清单.每个工厂都包含一系列不同的汽车模型.我想以这样的方式过滤工厂列表,我将只获得生产Mazda3的工厂.

我怎么能用lambda做到这一点?

应该是这样的:

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

Eug*_*ene 11

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

 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]] 
Run Code Online (Sandbox Code Playgroud)

编辑

看到你正在寻找你的例子 anyMatch


Hug*_* M. 6

这是应该做的事情:

factories.stream()
         .filter(factory -> factory.getCars().stream()
                           .anyMatch(car -> searchedName.equals(car.getName())))
         .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

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

factories.stream()
         .filter(factory -> factory.hasProduced(model))
         .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)

另请参阅在线"runnable"示例 - 因为它只显示方法通过编译,而不是带有数据的完整演示,但您可以在自己的代码中自己完成,所以......;)

  • 我喜欢你的第二种方法. (3认同)