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