Filtrando Elementos com o Método filter()
Ao trabalhar com coleções de dados em Java, frequentemente é necessário extrair elementos específicos que atendam a determinadas condições. Tradicionalmente, isso exige o uso de laços e instruções condicionais, tornando o código mais extenso. É nesse contexto que o método filter() se destaca.
Este método já foi utilizado em nossos exemplos, mas ainda não discutimos em detalhes o que ele recebe como argumento. Ele aceita uma interface funcional Predicate<T>, que define se um elemento deve ser incluído no stream resultante.
Stream<T> filter(Predicate<? super T> predicate);
Aqui, T é o tipo dos elementos no stream, e Predicate<? super T> é a condição de filtragem, usada para verificar cada elemento.
Aplicação Prática
Considere uma lista de funcionários, cada um com um name e yearsOfExperience na empresa. O objetivo é selecionar apenas aqueles que estão na empresa há mais de 5 anos para oferecer um bônus ou benefícios adicionais.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; class Employee { private final String name; private final int yearsOfExperience; public Employee(String name, int yearsOfExperience) { this.name = name; this.yearsOfExperience = yearsOfExperience; } public String getName() { return name; } public int getYearsOfExperience() { return yearsOfExperience; } @Override public String toString() { return name + " (" + yearsOfExperience + " years)"; } } public class Main { public static void main(String[] args) { List<Employee> employees = Arrays.asList( new Employee("John", 6), new Employee("Sarah", 4), new Employee("Mike", 7), new Employee("Anna", 3), new Employee("Tom", 8) ); // Filtering employees with more than 5 years of experience List<Employee> experiencedEmployees = employees.stream() .filter(e -> e.getYearsOfExperience() > 5) .toList(); System.out.println("Experienced employees: " + experiencedEmployees); } }
Neste exemplo, é criado um stream de funcionários utilizando stream(). Em seguida, com o método filter, são filtrados os funcionários que possuem mais de 5 anos de experiência.
O resultado é uma nova lista contendo apenas os funcionários que atendem a essa condição.
Quando usar filter
Na maioria dos casos, é melhor utilizar filter() no início para reduzir a quantidade de dados para as operações subsequentes. Isso melhora o desempenho, pois as operações posteriores serão realizadas em um conjunto de dados menor.
Exemplo
Se houver uma lista de funcionários e for necessário primeiro filtrar aqueles com mais de 5 anos de experiência e depois transformar os funcionários restantes em um formato diferente, faz sentido começar pela filtragem.
List<Employee> result = employees.stream()
.filter(e -> e.getYearsOfExperience() > 5) // First, `filter`
.map(e -> e.getName()) // Then apply other operations
.toList();
Como pode ser visto neste exemplo, o filter() é colocado antes do método map() porque permite reduzir o número de elementos com os quais você precisa trabalhar inicialmente. Você filtra os funcionários com mais de 5 anos de experiência e, em seguida, extrai seus nomes.
Essa ordem de operações é eficiente porque evita o processamento desnecessário de dados durante a fase de transformação.
1. O que o método filter() faz na Stream API?
2. Que tipo de argumento o método filter() aceita?
3. O que acontece se você usar uma condição no método filter() que sempre retorna false?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 2.33
Filtrando Elementos com o Método filter()
Deslize para mostrar o menu
Ao trabalhar com coleções de dados em Java, frequentemente é necessário extrair elementos específicos que atendam a determinadas condições. Tradicionalmente, isso exige o uso de laços e instruções condicionais, tornando o código mais extenso. É nesse contexto que o método filter() se destaca.
Este método já foi utilizado em nossos exemplos, mas ainda não discutimos em detalhes o que ele recebe como argumento. Ele aceita uma interface funcional Predicate<T>, que define se um elemento deve ser incluído no stream resultante.
Stream<T> filter(Predicate<? super T> predicate);
Aqui, T é o tipo dos elementos no stream, e Predicate<? super T> é a condição de filtragem, usada para verificar cada elemento.
Aplicação Prática
Considere uma lista de funcionários, cada um com um name e yearsOfExperience na empresa. O objetivo é selecionar apenas aqueles que estão na empresa há mais de 5 anos para oferecer um bônus ou benefícios adicionais.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647package com.example; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; class Employee { private final String name; private final int yearsOfExperience; public Employee(String name, int yearsOfExperience) { this.name = name; this.yearsOfExperience = yearsOfExperience; } public String getName() { return name; } public int getYearsOfExperience() { return yearsOfExperience; } @Override public String toString() { return name + " (" + yearsOfExperience + " years)"; } } public class Main { public static void main(String[] args) { List<Employee> employees = Arrays.asList( new Employee("John", 6), new Employee("Sarah", 4), new Employee("Mike", 7), new Employee("Anna", 3), new Employee("Tom", 8) ); // Filtering employees with more than 5 years of experience List<Employee> experiencedEmployees = employees.stream() .filter(e -> e.getYearsOfExperience() > 5) .toList(); System.out.println("Experienced employees: " + experiencedEmployees); } }
Neste exemplo, é criado um stream de funcionários utilizando stream(). Em seguida, com o método filter, são filtrados os funcionários que possuem mais de 5 anos de experiência.
O resultado é uma nova lista contendo apenas os funcionários que atendem a essa condição.
Quando usar filter
Na maioria dos casos, é melhor utilizar filter() no início para reduzir a quantidade de dados para as operações subsequentes. Isso melhora o desempenho, pois as operações posteriores serão realizadas em um conjunto de dados menor.
Exemplo
Se houver uma lista de funcionários e for necessário primeiro filtrar aqueles com mais de 5 anos de experiência e depois transformar os funcionários restantes em um formato diferente, faz sentido começar pela filtragem.
List<Employee> result = employees.stream()
.filter(e -> e.getYearsOfExperience() > 5) // First, `filter`
.map(e -> e.getName()) // Then apply other operations
.toList();
Como pode ser visto neste exemplo, o filter() é colocado antes do método map() porque permite reduzir o número de elementos com os quais você precisa trabalhar inicialmente. Você filtra os funcionários com mais de 5 anos de experiência e, em seguida, extrai seus nomes.
Essa ordem de operações é eficiente porque evita o processamento desnecessário de dados durante a fase de transformação.
1. O que o método filter() faz na Stream API?
2. Que tipo de argumento o método filter() aceita?
3. O que acontece se você usar uma condição no método filter() que sempre retorna false?
Obrigado pelo seu feedback!