Filtraggio degli Elementi con il Metodo filter()
Quando si lavora con collezioni di dati in Java, spesso è necessario estrarre specifici elementi che soddisfano determinate condizioni. Tradizionalmente, questo richiede cicli e istruzioni condizionali, rendendo il codice più prolisso. È qui che il metodo filter() viene in aiuto.
Hai già utilizzato questo metodo nei nostri esempi, ma non abbiamo ancora discusso in dettaglio cosa accetta come argomento. Accetta un'interfaccia funzionale Predicate<T>, che definisce se un elemento deve essere incluso nello stream risultante.
Stream<T> filter(Predicate<? super T> predicate);
Qui, T rappresenta il tipo degli elementi nello stream, e Predicate<? super T> è la condizione di filtraggio, utilizzata per verificare ciascun elemento.
Applicazione pratica
Si consideri una lista di dipendenti, ciascuno con un name e yearsOfExperience nell'azienda. Si desidera selezionare solo coloro che lavorano in azienda da più di 5 anni per offrire loro un bonus o ulteriori benefit.
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); } }
In questo esempio, viene creato uno stream di dipendenti utilizzando stream(). Successivamente, tramite il metodo filter, vengono filtrati i dipendenti che hanno più di 5 anni di esperienza.
Il risultato è una nuova lista contenente solo quei dipendenti che soddisfano questa condizione.
Quando usare filter
Nella maggior parte dei casi, è preferibile utilizzare filter() all'inizio per ridurre la quantità di dati per le successive operazioni. Questo migliora le prestazioni poiché le operazioni successive verranno eseguite su un dataset più piccolo.
Esempio
Se si dispone di una lista di dipendenti e si desidera prima filtrare quelli con più di 5 anni di esperienza e poi trasformare i restanti dipendenti in un formato diverso, ha senso iniziare con il filtraggio.
List<Employee> result = employees.stream()
.filter(e -> e.getYearsOfExperience() > 5) // First, `filter`
.map(e -> e.getName()) // Then apply other operations
.toList();
Come puoi vedere, in questo esempio, si posiziona il filter() prima del metodo map() perché consente di ridurre innanzitutto il numero di elementi su cui lavorare. Si filtrano i dipendenti con più di 5 anni di esperienza e poi si estraggono i loro nomi.
Questo ordine di operazioni è efficiente perché evita elaborazioni di dati non necessarie durante la fase di trasformazione.
1. Cosa fa il metodo filter() nello Stream API?
2. Che tipo di argomento accetta il metodo filter()?
3. Cosa succede se si utilizza una condizione nel metodo filter() che restituisce sempre false?
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Can you explain what a Predicate is in Java?
Can you show a full example with the Employee class?
Why is the order of filter and map important?
Awesome!
Completion rate improved to 2.33
Filtraggio degli Elementi con il Metodo filter()
Scorri per mostrare il menu
Quando si lavora con collezioni di dati in Java, spesso è necessario estrarre specifici elementi che soddisfano determinate condizioni. Tradizionalmente, questo richiede cicli e istruzioni condizionali, rendendo il codice più prolisso. È qui che il metodo filter() viene in aiuto.
Hai già utilizzato questo metodo nei nostri esempi, ma non abbiamo ancora discusso in dettaglio cosa accetta come argomento. Accetta un'interfaccia funzionale Predicate<T>, che definisce se un elemento deve essere incluso nello stream risultante.
Stream<T> filter(Predicate<? super T> predicate);
Qui, T rappresenta il tipo degli elementi nello stream, e Predicate<? super T> è la condizione di filtraggio, utilizzata per verificare ciascun elemento.
Applicazione pratica
Si consideri una lista di dipendenti, ciascuno con un name e yearsOfExperience nell'azienda. Si desidera selezionare solo coloro che lavorano in azienda da più di 5 anni per offrire loro un bonus o ulteriori benefit.
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); } }
In questo esempio, viene creato uno stream di dipendenti utilizzando stream(). Successivamente, tramite il metodo filter, vengono filtrati i dipendenti che hanno più di 5 anni di esperienza.
Il risultato è una nuova lista contenente solo quei dipendenti che soddisfano questa condizione.
Quando usare filter
Nella maggior parte dei casi, è preferibile utilizzare filter() all'inizio per ridurre la quantità di dati per le successive operazioni. Questo migliora le prestazioni poiché le operazioni successive verranno eseguite su un dataset più piccolo.
Esempio
Se si dispone di una lista di dipendenti e si desidera prima filtrare quelli con più di 5 anni di esperienza e poi trasformare i restanti dipendenti in un formato diverso, ha senso iniziare con il filtraggio.
List<Employee> result = employees.stream()
.filter(e -> e.getYearsOfExperience() > 5) // First, `filter`
.map(e -> e.getName()) // Then apply other operations
.toList();
Come puoi vedere, in questo esempio, si posiziona il filter() prima del metodo map() perché consente di ridurre innanzitutto il numero di elementi su cui lavorare. Si filtrano i dipendenti con più di 5 anni di esperienza e poi si estraggono i loro nomi.
Questo ordine di operazioni è efficiente perché evita elaborazioni di dati non necessarie durante la fase di trasformazione.
1. Cosa fa il metodo filter() nello Stream API?
2. Che tipo di argomento accetta il metodo filter()?
3. Cosa succede se si utilizza una condizione nel metodo filter() che restituisce sempre false?
Grazie per i tuoi commenti!