Mógłbym new List(Collection2.filter())
oczywiście skorzystać, ale w ten sposób nie ma gwarancji, że moje zamówienie pozostanie takie samo.
To nieprawda. Collections2.filter()
jest funkcją ocenianą leniwie - w rzeczywistości nie filtruje kolekcji, dopóki nie zaczniesz uzyskiwać dostępu do przefiltrowanej wersji. Na przykład, jeśli iterujesz po przefiltrowanej wersji, przefiltrowane elementy wyskakują z iteratora w tej samej kolejności, co oryginalna kolekcja (oczywiście bez odfiltrowanych).
Być może myślałeś, że filtruje z góry, a następnie zrzuca wyniki do dowolnego, nieuporządkowanego zbioru jakiejś formy - tak nie jest.
Jeśli więc użyjesz danych wyjściowych Collections2.filter()
jako danych wejściowych do nowej listy, oryginalna kolejność zostanie zachowana.
Używając importu statycznego (i Lists.newArrayList
funkcji), staje się dość zwięzły:
List filteredList = newArrayList(filter(originalList, predicate));
Zauważ, że while Collections2.filter
nie będzie chętnie iterował po kolekcji bazowej, Lists.newArrayList
będzie - wyodrębni wszystkie elementy przefiltrowanej kolekcji i skopiuje je do nowej ArrayList
.