Java 8根据其他对象列表过滤对象列表中的对象

时间:2017-09-20 13:47:09

标签: java list

我有一个对象列表,我有另一个对象列表,两个对象都不一样,除了共享一个属性外,通常不需要做太多共同的事情,那就是相同的是一场比赛。我想从另一个列表中过滤掉一个列表的条目。

例如: 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似乎也只是用于检查属性,如果是自己列表的对象,而不是另一个。

也可以在具有不同对象的两个列表上使用过滤器吗?

1 个答案:

答案 0 :(得分:0)

听起来更像是关于数据库访问的问题。您的方法hasEntry可能会从ds中检索苹果并将其与水果名称进行比较。对于效率低下的每种水果都会重复这种情况。

解决此问题的一种方法是将苹果存储在临时字段中并进行比较。您还可以检索苹果并创建一个HashSet<String>,其名称可用于与水果名称进行比较。

HashSet#contains的访问时间为O(1)。

这样的东西
List<Fruits> newFruits = fruits.stream().filter(e -> !hashSet.contains(e.getName())).collect(Collectors.toList());