从列表中删除具有空属性的对象的最有效方法

Most Efficient Way to Remove Objects With Null Attributes From a List

所以我想知道 java 中是否有更有效的方法来做到这一点?假设当前填充了对象列表...

for (Object obj : objects) {
   if (obj.getAttribute() == null) {
      objects.remove(obj);
   }
}

本质上,如果列表中的对象包含特定的空属性,我只想能够从给定列表中删除任何对象。想法?

在Java 8:

objects.removeIf(o -> o.getAttribute() == null);

在以前的版本中:

for (Iterator<MyObject> it = objects.iterator(); it.hasNext();) {
    if (it.next().getAttribute() == null)
        it.remove();
}

另见 Removing items from a collection in java while iterating over it。 (如您所示,for 循环可以抛出 ConcurrentModificationException。)

这两个 高效 因为它们允许 collection 以这样的方式进行迭代和删除他们想要,但我不认为这在这里 特别 重要,除非你有一个巨人 collection 并且经常这样做。

作为一个例子,这些可以如何变得更好,问题显示的代码对于链表来说时间复杂度很低(类似于 O(n<sup>2</sup> /2) 对于最坏的情况,我认为)因为对 objects.remove 的调用需要另一次遍历。使用 Iterator 可以让列表在不遍历的情况下进行删除。

使用 Iterator 对于 ArrayList 来说仍然很差,因为元素每次都会移位。 Java 8 版本是最好的。 ArrayList uses a BitSet 并一次完成所有移位。