【问题标题】:Why in Guava filter/transform functions sometimes return modifiable view and some returns unmodifiable view?为什么在 Guava 过滤器/转换函数中有时会返回可修改的视图,而有些则返回不可修改的视图?
【发布时间】:2011-10-06 03:26:12
【问题描述】:

例如,所有 Lists、Collections2、Sets 返回一个可修改的视图 - 从视图集合中移除将移除原始项目。

这很好用:

List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6, -1, -2, -3, -4);    
Collection<Integer> transform = Collections2.filter(
    list, new Predicate<Integer>() {
        public boolean apply(Integer input) {
            return input.intValue() > 0;
        }
    });
transform.clear();

当我使用 Iterables 和 Iterators 方法过滤/转换时,我得到了不可修改的视图(即所有这些代码都重用了 UnmodifibleIterator)。

这不起作用:

List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6, -1, -2, -3, -4);
Iterable<Integer> transform = Iterables.filter(
    list, new Predicate<Integer>() {
        public boolean apply(Integer input) {
            return input.intValue() > 0;
        }
    });
Iterables.removeIf(transform, Predicates.<Object>alwaysTrue());

我在 Iterable 和 Collection/List/Set/Map 之间找不到任何语义差异,那么为什么在 Guava 中有如此不同的实现?

另一个奇怪的行为是第一种情况下的迭代器仍然不允许删除操作,但 clear 或 remove/removeAll 工作正常。

【问题讨论】:

    标签: java guava


    【解决方案1】:

    Iterators.transform(和Iterables.transform,通过扩展)确实支持remove()。来自它的 Javadoc:

    如果提供的迭代器支持remove(),则返回的迭代器支持。

    Iterators.filter,然而,没有。这样做的原因是过滤迭代器无法在不调用底层迭代器上的next() 的情况下实现hasNext()。在底层迭代器上调用 hasNext() 是不够的,因为该迭代器中的下一个元素(以及之后的每个元素,也可能)可能与 Predicate 不匹配。

    那么,问题是在过滤的迭代器上调用hasNext()必须提升底层迭代器的位置。这可以防止对remove() 的后续调用删除最近对next() 的调用返回的元素(这是remove() 合同的一部分)。因此,过滤迭代器不支持remove()

    过滤后的CollectionIterator 具有完全相同的问题(实际上,它是使用Iterators.filter 创建的)。 clear()removeAll 方法之所以有效,是因为它们可以完全控制迭代器(它们都是使用 Iterables.removeIf 实现的)。

    【讨论】:

    • 谢谢,有道理。遗憾的是,有时无法使想法正确。
    • 顺便说一下,这样的迭代器只能在使用当前值之前调用 hasNext() 的情况下抛出异常,而在常见的(最流行的)情况下,例如 while(i.hasNext()){i.next(); i.remove();} 它不需要。所以有可能使它适用于几乎所有情况,只有在一些不规则的情况下才会抛出这样的异常......
    猜你喜欢
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多