2017-09-20 130 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看我的編輯。類似的東西 –