繁体   English   中英

从列表中删除符合指定条件的对象

[英]Remove object from list that matched a specified criteria

我有一个Pojo List ,它有大约10000个对象。

我需要从此List中删除一个对象,其中pojo.getAccountId() = provided String

是否可以删除该对象而不必遍历整个列表? 我必须进行大量删除操作,因此我不想遍历列表。

目前,我正计划从列表中创建一个hashmap<> ,其中key = pojo.getAccountId() 使用map我可以做map.remove(key)

如果可能的话,我想避免这种转换过程。

无论您使用哪种方法,都将始终在列表中进行迭代以删除元素。 您唯一可以做的就是尽可能地缩短并整理代码。

这是Java 8 one衬板

 boolean removed = myList.removeIf(pojo -> pojo.getAccountId().equals(provided));

不要将数据存储在List中,而应存储在java.util.Map (由id键控)。 remove()将是一个哈希查找。

如果要维护顺序,请使用LinkedHashMapTreeMap

我喜欢使用apache commons库中的CollectionUtils。 它有一个过滤器方法,您需要将谓词传递给该方法。

public void filterList(List<MyObject> myList, String testString) {
    CollectionUtils.filter(myList, new Predicate<MyObject>() {
        @Override
        public boolean evaluate(MyObject myObject) {
            return myObject.getAccountId().equals(testString);
        }
    });
}

这将从列表中删除与谓词中描述的条件匹配的所有对象。 如果要执行相反的操作,则可以更改条件,也可以使用filterInverse方法。 但是,当然,它隐式地使用了for循环,但对您而言是隐藏的。

Apache公用区: http//commons.apache.org/proper/commons-collections/

CollectionUtils: http : //commons.apache.org/proper/commons-collections/javadocs/api-release/org/apache/commons/collections4/CollectionUtils.html

希望对您有所帮助。

编辑

就像Narmer所说的那样,如果您使用JDK 1.8,它甚至更容易。 您可以在列表上创建流,并以相同的方式调用filter方法。

myList.stream()
    .filter(myObject -> myObject.getAccountId().equals(testString))
    .collect(Collectors.toList())

除非您的List实现是外来List ,否则它比任何核心库集合类型都了解其元素更多。

库存List仅在检查两个清单的包含性或相等性时才调用其内容equals方法,在为整个清单生成hashCode时调用hashCode ,并且在清单被序列化时可能会调用其序列化挂钩。


目前,我正计划从列表中创建一个HashMap<> ,其中key = pojo.getAccountId()

听起来不错。 您可能希望使用LinkedHashMap来保留原始列表中的迭代顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM