【发布时间】:2012-05-07 12:18:09
【问题描述】:
从 Collections2.filter 返回的集合是不可修改的,它的迭代器也是如此。
有没有类似的东西可以返回我过滤的集合实时视图,但带有可修改的迭代器?我需要在迭代器上使用remove() 方法。
谢谢。
【问题讨论】:
-
这对于
filter来说听起来不是一个好的用例,它来自函数式编程并且传统上返回一个只读集合。为什么不使用普通的旧for循环? -
@duduanar:为什么不使用显式循环?我认为我们需要有关您的特定用例的更多信息。另请记住,您始终可以将
filter返回的集合分配回原始源。 Guava 非常强调不变性的概念,这与您的要求相矛盾。 -
仅供参考,
Collections.filter的工作方式——或者任何过滤器,坦率地说——意味着你不能删除元素。特别是,在您调用remove()时,支持迭代器可能已经向前移动,如果它完全起作用,可能会导致严重的意外行为。 -
Louis,我不明白后备迭代器如何意外移动?
Collections2创建它,其他人没有直接引用。 -
Collections2.filter(collection, predicate).iterator().hasNext()可能必须将后备迭代器推进几个元素,以查看迭代器中的任何剩余元素是否满足谓词,但在推进后备迭代器后,remove()将不会不再删除之前返回的元素。