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

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

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

这可以删除这个对象而不必迭代整个列表吗? 我必须做很多删除,所以我不想迭代列表。

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

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

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

 public void filterList(List myList, String testString) { CollectionUtils.filter(myList, new Predicate() { @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,它会更容易。 您可以在列表中创建流,并以相同的方式调用filterMethod。

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

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

这是一个Java 8 one liner :

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

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

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

除非您的List实现是奇特的List ,它比任何核心库集合类型更了解其元素。

Stock List只在调用两个列表的包含或相等时调用它们的内容equals方法, hashCode在为列表整体生成hashCode时,以及列表序列化时可能的序列化挂钩。


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

这听起来像一个很好的选择。 您可能希望使用LinkedHashMap来保留原始列表中的迭代顺序。