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