Filtrage des éléments avec la méthode filter()
Glissez pour afficher le menu
Lors de la manipulation de collections de données en Java, il est souvent nécessaire d’extraire des éléments spécifiques répondant à certaines conditions. Traditionnellement, cela nécessite des boucles et des instructions conditionnelles, ce qui rend le code plus verbeux. C’est là que la méthode filter() intervient.
Vous avez déjà utilisé cette méthode dans nos exemples, mais nous n’avons pas encore détaillé ce qu’elle prend comme argument. Elle accepte une interface fonctionnelle Predicate<T>, qui définit si un élément doit être inclus dans le stream résultant.
Stream<T> filter(Predicate<? super T> predicate);
Ici, T représente le type des éléments dans le flux, et Predicate<? super T> est la condition de filtrage, utilisée pour vérifier chaque élément.
Application pratique
Supposons que vous disposiez d'une liste d'employés, chacun ayant un name et un yearsOfExperience dans l'entreprise. Vous souhaitez sélectionner uniquement ceux qui travaillent dans l'entreprise depuis plus de 5 ans afin de leur offrir une prime ou des avantages supplémentaires.
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); } }
Dans cet exemple, un flux d'employés est créé à l'aide de stream(). Ensuite, la méthode filter est utilisée pour filtrer les employés ayant plus de 5 ans d'expérience.
Le résultat est une nouvelle liste contenant uniquement les employés répondant à cette condition.
Quand utiliser filter
Dans la plupart des cas, il est préférable d'utiliser filter() au début afin de réduire la quantité de données pour les opérations suivantes. Cela améliore les performances puisque les opérations ultérieures seront effectuées sur un ensemble de données plus restreint.
Exemple
Si une liste d'employés est disponible et qu'il est nécessaire de filtrer d'abord ceux ayant plus de 5 ans d'expérience, puis de transformer les employés restants dans un autre format, il est logique de commencer par le filtrage.
List<Employee> result = employees.stream()
.filter(e -> e.getYearsOfExperience() > 5) // First, `filter`
.map(e -> e.getName()) // Then apply other operations
.toList();
Comme illustré dans cet exemple, il convient de placer la méthode filter() avant la méthode map() car cela permet de réduire le nombre d'éléments à traiter en premier lieu. Les employés ayant plus de 5 ans d'expérience sont filtrés, puis leurs noms sont extraits.
Cet ordre d'opérations est efficace car il évite un traitement de données inutile lors de la phase de transformation.
1. Que fait la méthode filter() dans l'API Stream ?
2. Quel type d'argument la méthode filter() accepte-t-elle ?
3. Que se passe-t-il si vous utilisez une condition dans la méthode filter() qui retourne toujours false ?
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion