Podría usar, new List(Collection2.filter())
por supuesto, pero de esta manera no se garantiza que mis pedidos sigan siendo los mismos.
Eso no es cierto. Collections2.filter()
es una función evaluada de forma perezosa: en realidad no filtra su colección hasta que comienza a acceder a la versión filtrada. Por ejemplo, si itera sobre la versión filtrada, los elementos filtrados saldrán del iterador en el mismo orden que su colección original (menos los filtrados, obviamente).
Quizás estaba pensando que hace el filtrado por adelantado, luego vuelca los resultados en una Colección arbitraria y desordenada de alguna forma, no es así.
Así que si se utiliza la salida de Collections2.filter()
como la entrada a una nueva lista, entonces su orden original será retenido.
Usando importaciones estáticas (y la Lists.newArrayList
función), se vuelve bastante conciso:
List filteredList = newArrayList(filter(originalList, predicate));
Nótese que si bien Collections2.filter
no con impaciencia iterar sobre la colección subyacente, Lists.newArrayList
será - se va a extraer todos los elementos de la colección filtrada y copiarlos en una nueva ArrayList
.