我有一个对象列表,我有另一个对象列表,两个对象都不一样,除了共享一个属性外,通常不需要做太多共同的事情,那就是相同的是一场比赛。我想从另一个列表中过滤掉一个列表的条目。
例如: Object Apple具有String属性Name和boolean isOrdered。 Object Fruit:具有String属性Name和可用布尔值
Say ArrayList apple填充了名称属性为的条目:fuji,pink lady和ArrayList fruit with entries fuji,pink lady,gala,williams,ume。
我在结果列表中想要的是包含以下内容的水果列表:gala,williams,ume。
使用旧的java方法,这可以通过循环来实现:
for (Fruit fruit: fruits) {
if (!hasEntry(apples, fruit.getName())) {
result.add(fruit)
}
}
hasEntry要么从数据库中获取所有苹果并循环遍历列表,要么直接在数据库中查找fruitname。无论哪种方式都很慢。
如果对象相同,我可以使用fruits.removeAll(apples)。 java 8 list.filter似乎也只是用于检查属性,如果是自己列表的对象,而不是另一个。
也可以在具有不同对象的两个列表上使用过滤器吗?
答案 0 :(得分:0)
听起来更像是关于数据库访问的问题。您的方法hasEntry
可能会从ds中检索苹果并将其与水果名称进行比较。对于效率低下的每种水果都会重复这种情况。
解决此问题的一种方法是将苹果存储在临时字段中并进行比较。您还可以检索苹果并创建一个HashSet<String>
,其名称可用于与水果名称进行比较。
HashSet#contains
的访问时间为O(1)。
像
这样的东西List<Fruits> newFruits = fruits.stream().filter(e -> !hashSet.contains(e.getName())).collect(Collectors.toList());