我有List
Pojo
,其中有大约10000个对象。
我需要从List
pojo.getAccountId() = provided String
中删除一个对象。
这是否可以删除此对象而不必遍历整个列表? 我必须做很多删除工作,所以我不想迭代列表。
目前我打算从我的列表中hashmap<>
创建一个key = pojo.getAccountId()
。使用地图我可以map.remove(key)
。
如果可能的话,我想避免这种转换过程。
答案 0 :(得分:6)
无论您使用哪种方法,都会遍历列表以删除元素。你唯一能做的就是尽可能缩短和美化你的代码。
boolean removed = myList.removeIf(pojo -> pojo.getAccountId().equals(provided));
答案 1 :(得分:2)
不要将数据存储在List中,而是存储在java.util.Map
中(以id键入)。 remove()
将是哈希查找。
如果您想维护订单,请使用LinkedHashMap
或TreeMap
。
答案 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
来保留原始列表中的迭代顺序。