[Resolvido] Filtro em ArrayList

Bom dia.

Caso: Faço um select em uma tabela do banco e o mesmo me retorna todos os registros que guardo em um ArrayList, caso seja feita uma filtragem em minha tela hoje em dia acabo fazendo um novo select para trazer estes registros, gostaria de trabalhar com o ArrayList que já tenho em memória.

Duvida: Gostaria de saber se é possível “adicionar” filtros a este ArrayList? (Vi alguns casos utilizando for e um novo ArrayList mas não teria algo que facilitasse a nossa vida nesta parte sem ter que ficar povoando um novo ArrayList?)

Obrigado.

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]

Prezado Rodrigo, primeiramente parabéns, estou de queixo caído com a resposta!

Fiz alguns testes com o Guava, se encaixa perfeitamente no que eu necessito e também sai dessa parte ?feia? da programação.

O tópico já esta adicionado aos meus favoritos, abraços e uma ótima tarde!

[quote=Malister]Prezado Rodrigo, primeiramente parabéns, estou de queixo caído com a resposta!

Fiz alguns testes com o Guava, se encaixa perfeitamente no que eu necessito e também sai dessa parte ?feia? da programação.

O tópico já esta adicionado aos meus favoritos, abraços e uma ótima tarde!
[/quote]
Opa, sem problemas :slight_smile: O bom é que você fez uma pergunta em um tópico que me interessa bastante :smiley:

Já que vai adicionar o Guava no seu projeto, não tenha medo de explorar tudo o que ele tem.

Essa biblioteca, como a apache commons, tem bastante coisa que pode aumentar sua produtividade