2017-04-10 30 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)