Почему в функциях фильтра / преобразования Guava иногда возвращают изменяемое представление, а некоторые - неизменяемое представление?

Например, все списки, коллекции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 работает нормально.

7
задан Kev 15 July 2011 в 19:19
поделиться