[英]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()
将是一个哈希查找。
如果要维护顺序,请使用LinkedHashMap
或TreeMap
。
我喜欢使用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.