Подтвердить что ты не робот

Guava: Iterables.filter VS Collections2.filter, какая-то большая разница?

Я хотел бы узнать в Guava, если есть какие-либо различия между Iterables.filter(Iterable, Predicate) и Collections2.filter(Collection, Predicate) методы?

Кажется, что они поддерживают итерационный порядок и предоставляют живое представление. Javadoc говорит, что вызов Collections2.filter().size() будет выполнять итерацию по всем элементам.

Предположим, у меня есть предикат для фильтрации списка элементов, и в результате я хочу, чтобы количество элементов, оставшихся в представлении (или список, не имеет значения). Что я должен использовать? Кажется, проще использовать Collections2.filter, поскольку метод size() предоставляется Collection s.

Но на заднем плане есть разница между:

ImmutableList.copyOf(
    Iterables.filter(lead.getActions(), isRealActionDoneByUserPredicate)
).size();

и

Collections2.filter(lead.getActions(),isRealActionDoneByUserPredicate).size();

Кстати, строит ImmutableList быстрее, чем создание нормального ArrayList?

4b9b3361

Ответ 1

Гуава здесь.

Collections2.filter(elements, predicate).size()

является предпочтительным, так как он не копирует - оба метода filter возвращают представление, но

Iterables.size(Iterables.filter(elements, predicate))

по существу эквивалентен, и аналогичным образом найдет ответ без какого-либо копирования.

Что касается относительной скорости построения ArrayList по сравнению с ImmutableList, то он зависит от используемого метода построения:

  • ImmutableList.copyOf(collection) должно занимать почти ровно столько же времени. (Он должен проверить нули, но это дешево.)
  • ImmutableList.builder()....build() принимает небольшой постоянный множитель дольше, потому что он должен использовать ArrayList внутри Builder, так как мы заранее не знаем, сколько элементов будет добавлено.
  • ImmutableList.of(...) будет иметь одинаковую скорость.

Тем не менее, концептуальные преимущества использования ImmutableList часто перевешивают небольшие затраты на производительность, особенно если вы часто будете распространять списки.