2017-09-20 92 views
0

我有对象的列表,我有另一对象的名单列表上的对象名单,这两个对象是不一样的,一般不会有很多共同点做,除了它们共享一个属性,在匹配时是相同的。我想从另一个列表中筛选出一个列表的条目。的Java 8过滤对象进行基于其他对象

例如: 对象苹果isOrdered String属性名称和布尔。 对象水果:有字符串属性名称和布尔值可用

说ArrayList苹果充满条目,其名称属性如此:富士,粉红女士和ArrayList水果与条目富士,粉红女士,晚会,威廉姆斯,梅。

我想在resultslist什么是含有水果的清单:盛大,威廉姆斯,UME。

具有旧的Java方法,这可以用一个循环来实现:

for (Fruit fruit: fruits) { 
    if (!hasEntry(apples, fruit.getName())) { 
    result.add(fruit) 
    } 
} 

与hasEntry是无论是从数据库中获取的所有苹果遍历列表或直接寻找数据库中的fruitname。无论哪种方式都很慢。

如果对象是相同的,我可以只使用fruits.removeAll(苹果)。 java 8 list.filter也似乎只是用于检查属性,如果自己的列表中的对象,而不是另一个。

可以过滤还对两个清单不同势对象一起使用?

回答

0

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

一种方式是通过在临时字段,其存储的苹果,比较这一点。您也可以检索苹果,并创建一个HashSet<String>及其名称,您可以使用它们与水果名称进行比较。

访问时间将是O(1)为HashSet#contains

喜欢的东西

List<Fruits> newFruits = fruits.stream().filter(e -> !hashSet.contains(e.getName())).collect(Collectors.toList()); 
+0

HashSet中看起来像一个很好的方式,我可以使用流映射函数摘录从数据库中苹果列表中的所有名称。 也可能有办法一次完成这个任务吗? – kumoyadori

+0

@kumoyadori看我的编辑。类似的东西 –