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

时间:2014-08-25 15:52:42

标签: java list

我有List Pojo,其中有大约10000个对象。

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

这是否可以删除此对象而不必遍历整个列表? 我必须做很多删除工作,所以我不想迭代列表。

目前我打算从我的列表中hashmap<>创建一个key = pojo.getAccountId()。使用地图我可以map.remove(key)

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

4 个答案:

答案 0 :(得分:6)

无论您使用哪种方法,都会遍历列表以删除元素。你唯一能做的就是尽可能缩短和美化你的代码。

这是Java 8 one liner

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

答案 1 :(得分:2)

不要将数据存储在List中,而是存储在java.util.Map中(以id键入)。 remove()将是哈希查找。

如果您想维护订单,请使用LinkedHashMapTreeMap

答案 2 :(得分:1)

我喜欢使用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 commons: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,它会更容易。您可以在列表中创建流,并以相同的方式调用过滤器方法。

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

答案 3 :(得分:0)

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

Stock List只有在检查两个列表的包含或相等时调用其内容equals方法,hashCode为整个列表生成hashCode时,列表序列化时,可能还有序列化挂钩。


  

目前我打算从我的列表中创建一个HashMap<>,其中key = pojo.getAccountId()

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