Например, все списки, коллекции2, наборы возвращают изменяемое представление - удаление из коллекции представлений приведет к удалению исходных элементов.
] Это отлично работает:
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();
Когда я использую методы filter / transform 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 так разные реализации?
Другое странное поведение заключается в том, что итератор в первом случае все еще не разрешает операцию удаления, но очищает или удаляет / removeAll работает нормально.