过滤具有内部列表条件的列表
Posted
技术标签:
【中文标题】过滤具有内部列表条件的列表【英文标题】: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());
【问题讨论】:
【参考方案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——因为它仅表明方法通过了编译,而不是包含数据的完整演示,但您可以在自己的代码中自己完成,所以...;)
【讨论】:
我喜欢你的第二种方法。以上是关于过滤具有内部列表条件的列表的主要内容,如果未能解决你的问题,请参考以下文章
如何过滤列表视图中的内部子元素以及使用 Jquery 在移动应用程序中将字母滚动条添加到列表视图的任何简单方法
过滤具有多对多关系的对象,检查它是不是包含列表中的至少一个元素
如何过滤复杂对象的列表,以便如果两个具有字段值,我会根据条件删除一个