2017-04-10 29 views
-2
List<Object1> list1 = userVo.getMstCardTypeVOs(); 
Object1 object1 = new Object1(); 
object1.setId(1); 
object1.setName("Test"); 
-- More fields which are not matched with object2 
list1.add(object1); 

object1 = new Object1(); 
object1.setId(2); 
object1.setName("Test1"); 
-- More fields which are not matched with object1 
list1.add(object1) 

List<Object2> list2 = mapMenuProgramRepo.findAll(); 
Object2 object2 = new Object2(); 
object2.setId(1); 
object2.setName("Test"); 
list1.add(object2); 

object2 = new Object2(); 
object2.setId(2); 
object2.setName("Test1"); 
list1.add(object2); 

我需要檢查相同的ID存在於list1與列表2的引用?操作列表和刪除列表中的數據

我用下面的代碼:

for (Object1 object1 : obj1) { 
    for (Object2 obj2: obj2) { 
     if (object2.getId().equals(object1.getId())) { 
      // removed entry from the list1 
      // We can removed by using iterator instead of list 
     } 
    } 
} 

什麼更好的方式和優化使用jdk8或7路?從列表1

+0

我見您使用JDK 8它是更有效的JDK7 –

+1

[這](http://stackoverflow.com/questions/31683375/java- 8-lambda-intersection-of-two-lists)可能值得看看 – jrook

回答

0

//刪除條目

如果您需要從列表比你可以使用下面的代碼

list1.removeIf(val1 -> list2.stream() 
.filter(val2 -> val2.getId().equals(val1.getId()).findFirst().orElse(null) != null) 
0

與JDK8溪流爲此,您可以輕鬆地之一刪除如下所示使用noneMatch()方法:

list1.removeIf(value1 -> 
    list2.stream().anyMatch(value2 -> 
    (value2.getId().equals(value1.getId))));//equal ids then remove it from list1 

如果您有要解決這個問題,而不使用流,那麼你需要使用Iterator(看here例如在刪除),然後通過list1list2remove匹配元素循環從list1


另外,我建議絕不要使用Object1Object2等創建任何類名(甚至是示例類),因爲它對於其他開發人員來說非常混亂(即,不容易理解類名爲Object1Object2)的代碼。

+0

我越來越obj2無法解決這個異常 –

+0

你可以看上面的,錯字錯誤 – developer

+0

我很困惑:在我看來它應該是'anyMatch '而不是'noneMatch' –

0

雖然像其他答案一樣使用流看起來很酷,但它可能不是最優的,特別是當list2中有很多值時。

而不是使用流來驗證是否在list2存在一個值,該值的O(M*N)複雜(M,N爲list1list2值的數目),我會建議做這樣的事情:

Set<> excludeIds = list2.stream().map(Object2::getId).collect(Collectors.toSet()); 
list1.removeIf(v -> excludeIds.contains(v.getId())); 

更容易理解,運行更快。

隨着HashSet,所述的邏輯的複雜性減少到O(M+N)