Tem algumas ideias interessantes.
Se você for ver do ponto de vista de programação funcional, você poderia chamar um método da sua lista chamado filter, enviando uma função que será aplicada a cada item da sua coleção, dizendo se o filtro vai remover aquele item da lista ou não.
Em Java, a maneira mais simples de fazer isso é como você mesmo disse, criando uma lista nova, e iterando a lista antiga. É simples, feio, e funciona.
Por exemplo, filtrar os números pares de uma lista de números:[code] public static void main(String[] args){
List numeros = Arrays.asList(new Integer[]{1, 2, 3, 4, 5 ,6, 7, 8, 9, 10});
List<Integer> pares = new ArrayList<Integer>();
for(Integer numero : numeros){
if(numero % 2 == 0){
pares.add(numero);
}
}
}[/code]Agora como fazer isso sem toda essa verbosidade? Eu falei sobre isso [url="http://rodrigosasaki.com/2013/02/15/como-scala-faz-a-magica/"]nesse post[/url], caso queira dar uma lida pode te dar umas ideias. Mas a ideia geral é que você pode fazer isso utilizando uma [i]classe interna anônima.[/i]
Agora para o seu caso em específico, onde você vai trabalhar em cima da mesma lista, talvez seja melhor manter uma mesma lista, e criar diversas visões em cima dessa lista.
Você pode fazer isso usando o Google Guava (ou na mão mesmo), criando Iterables diferentes para cada filtro que queira aplicar.
O exemplo acima reescrito com Guava fica assim:[code] public static void main(String[] args){
List numeros = Arrays.asList(new Integer[]{1, 2, 3, 4, 5 ,6, 7, 8, 9, 10});
Iterable<Integer> pares = Iterables.filter(numeros, new Predicate<Integer>(){
@Override
public boolean apply(Integer num) {
return num % 2 == 0;
}
});
}[/code]A vantagem disso é que você não cria um [i]List [/i]inteiro novo, simplesmente um [i]Iterable[/i]. E ele sendo [i]Iterable [/i]você pode percorrê-lo em um for normalmente.[code] for(Integer num : pares){
System.out.println(num);
}[/code]