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);
我需要检查list1中是否存在相同的id,并引用list2?
我使用了以下代码:
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的更好的方法和优化方式是什么?
答案 0 :(得分:0)
//从list1中删除了条目
如果您需要从列表中删除,则可以使用以下代码
list1.removeIf(val1 -> list2.stream()
.filter(val2 -> val2.getId().equals(val1.getId()).findFirst().orElse(null) != null)
答案 1 :(得分:0)
使用list1.removeIf(value1 ->
list2.stream().anyMatch(value2 ->
(value2.getId().equals(value1.getId))));//equal ids then remove it from list1
方法
list1
如果必须在不使用流的情况下解决问题,则需要使用 Iterator (例如,在移除时查看here),然后循环遍历{{ 1}}和list2
以及remove
来自list1
另外,我建议永远不要使用Object1
或Object2
等创建任何类名(甚至是示例类),因为它对其他开发人员来说非常混乱(即,它不容易理解类名为Object1
,Object2
)的代码。
答案 2 :(得分:0)
虽然像其他答案一样使用流看起来很酷,但它可能不是最佳的,尤其是当list2
中有很多值时。
而不是使用流来验证list2
中是否存在值,这会给O(M*N)
的复杂性(list1
和list2
中的值的数量为M,N ,我建议做的事情如下:
Set<> excludeIds = list2.stream().map(Object2::getId).collect(Collectors.toSet());
list1.removeIf(v -> excludeIds.contains(v.getId()));
更容易理解,并且运行得更快。
使用HashSet
时,逻辑的复杂性会降低到O(M+N)