操作列表和从列表中删除的数据

时间:2017-04-10 07:10:39

标签: java

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的更好的方法和优化方式是什么?

3 个答案:

答案 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 方法

,您可以使用JDK8流轻松完成此操作,如下所示
list1

如果必须在不使用流的情况下解决问题,则需要使用 Iterator (例如,在移除时查看here),然后循环遍历{{ 1}}和list2以及remove来自list1

的匹配元素

另外,我建议永远不要使用Object1Object2等创建任何类名(甚至是示例类),因为它对其他开发人员来说非常混乱(即,它不容易理解类名为Object1Object2)的代码。

答案 2 :(得分:0)

虽然像其他答案一样使用流看起来很酷,但它可能不是最佳的,尤其是当list2中有很多值时。

而不是使用流来验证list2中是否存在值,这会给O(M*N)的复杂性(list1list2中的值的数量为M,N ,我建议做的事情如下:

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

更容易理解,并且运行得更快。

使用HashSet时,逻辑的复杂性会降低到O(M+N)