new List(Collection2.filter())
Конечно, я мог бы использовать , но таким образом не гарантируется, что мой порядок останется прежним.
Это неправда. Collections2.filter()
это функция с отложенным вычислением - она фактически не фильтрует вашу коллекцию, пока вы не начнете получать доступ к отфильтрованной версии. Например, если вы перебираете отфильтрованную версию, то отфильтрованные элементы будут появляться из итератора в том же порядке, что и исходная коллекция (за вычетом отфильтрованных, очевидно).
Возможно, вы думали, что он выполняет фильтрацию заранее, а затем выгружает результаты в произвольную, неупорядоченную коллекцию некоторой формы - это не так.
Поэтому, если вы используете вывод в Collections2.filter()
качестве входных данных для нового списка, то ваш исходный порядок будет сохранен.
Используя статический импорт (и Lists.newArrayList
функцию), он становится довольно лаконичным:
List filteredList = newArrayList(filter(originalList, predicate));
Обратите внимание , что в то время Collections2.filter
не охотно итерация по основной коллекции, Lists.newArrayList
будет - он будет извлекать все элементы отфильтрованной коллекции и скопировать их в новый ArrayList
.