【问题标题】:Google collections - modifiable iterator from collections.filter?谷歌集合 - 来自 collections.filter 的可修改迭代器?
【发布时间】: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() 将不会不再删除之前返回的元素。

标签: java guava


【解决方案1】:

new ArrayList(Collections2.filter(...)) 怎么样?如果您出于某种原因坚持使用过滤器。

顺便说一句,Collections2.filter 不是不可修改的。它是只允许Predicate 逻辑元素的集合。

【讨论】:

  • 这会将Collections2.filter() 的内容复制到一个新的ArrayList 中。从该列表中删除元素不会将它们从原始集合中删除。
猜你喜欢
  • 2013-05-13
  • 2015-09-07
  • 2010-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 2014-01-31
相关资源
最近更新 更多