Je pourrais new List(Collection2.filter())
bien sûr utiliser , mais de cette façon, il n'est pas garanti que ma commande reste la même.
Ce n'est pas vrai. Collections2.filter()
est une fonction évaluée paresseusement - elle ne filtre pas réellement votre collection tant que vous ne commencez pas à accéder à la version filtrée. Par exemple, si vous parcourez la version filtrée, les éléments filtrés sortiront de l'itérateur dans le même ordre que votre collection d'origine (moins ceux filtrés, évidemment).
Peut-être pensiez-vous qu'il effectue le filtrage à l'avance, puis vide les résultats dans une collection arbitraire et non ordonnée d'une certaine forme - ce n'est pas le cas.
Ainsi, si vous utilisez la sortie de Collections2.filter()
comme entrée d'une nouvelle liste, votre commande d'origine sera conservée.
En utilisant les importations statiques (et la Lists.newArrayList
fonction), cela devient assez succinct:
List filteredList = newArrayList(filter(originalList, predicate));
Notez que tout Collections2.filter
ne sera pas avec impatience parcourir la collection sous - jacente, Lists.newArrayList
sera - il extraira tous les éléments de la collection filtrée et les copier dans un nouveau ArrayList
.