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