【发布时间】: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 工作正常。
【问题讨论】: