Filtrering af Elementer med filter()-Metoden
Ved arbejde med datakollektioner i Java opstår ofte behovet for at udtrække specifikke elementer, der opfylder bestemte betingelser. Traditionelt kræver dette løkker og betingede udsagn, hvilket gør koden mere omfangsrig. Her kommer filter()-metoden til undsætning.
Denne metode er allerede blevet anvendt i vores eksempler, men vi har endnu ikke gennemgået detaljeret, hvad den tager som argument. Den accepterer et funktionelt interface Predicate<T>, som definerer, om et element skal inkluderes i den resulterende stream.
Stream<T> filter(Predicate<? super T> predicate);
Her er T typen af elementer i strømmen, og Predicate<? super T> er filtreringsbetingelsen, der bruges til at kontrollere hvert element.
Praktisk anvendelse
Antag, at du har en liste over medarbejdere, hver med et name og yearsOfExperience i virksomheden. Du ønsker kun at vælge dem, der har været i virksomheden i mere end 5 år for at tilbyde dem en bonus eller yderligere fordele.
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); } }
I dette eksempel oprettes en stream af medarbejdere ved hjælp af stream(). Derefter anvendes filter-metoden til at filtrere medarbejdere med mere end 5 års erfaring.
Resultatet er en ny liste, der kun indeholder de medarbejdere, som opfylder denne betingelse.
Hvornår skal filter anvendes
I de fleste tilfælde er det bedst at bruge filter() i begyndelsen for at reducere mængden af data til efterfølgende operationer. Dette forbedrer ydelsen, da senere operationer udføres på et mindre datasæt.
Eksempel
Hvis du har en liste over medarbejdere og først vil filtrere dem med mere end 5 års erfaring og derefter omdanne de resterende medarbejdere til et andet format, giver det mening at starte med filtrering.
List<Employee> result = employees.stream()
.filter(e -> e.getYearsOfExperience() > 5) // First, `filter`
.map(e -> e.getName()) // Then apply other operations
.toList();
Som det ses i dette eksempel, placeres filter() før map() metoden, da det gør det muligt først at reducere antallet af elementer, der skal behandles. Du filtrerer medarbejdere med mere end 5 års erfaring, og derefter udtrækkes deres navne.
Denne rækkefølge af operationer er effektiv, da den forhindrer unødvendig databehandling under transformationsfasen.
1. Hvad gør filter()-metoden i Stream API?
2. Hvilken type argument accepterer filter()-metoden?
3. Hvad sker der, hvis du bruger en betingelse i filter()-metoden, der altid returnerer false?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
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
Filtrering af Elementer med filter()-Metoden
Stryg for at vise menuen
Ved arbejde med datakollektioner i Java opstår ofte behovet for at udtrække specifikke elementer, der opfylder bestemte betingelser. Traditionelt kræver dette løkker og betingede udsagn, hvilket gør koden mere omfangsrig. Her kommer filter()-metoden til undsætning.
Denne metode er allerede blevet anvendt i vores eksempler, men vi har endnu ikke gennemgået detaljeret, hvad den tager som argument. Den accepterer et funktionelt interface Predicate<T>, som definerer, om et element skal inkluderes i den resulterende stream.
Stream<T> filter(Predicate<? super T> predicate);
Her er T typen af elementer i strømmen, og Predicate<? super T> er filtreringsbetingelsen, der bruges til at kontrollere hvert element.
Praktisk anvendelse
Antag, at du har en liste over medarbejdere, hver med et name og yearsOfExperience i virksomheden. Du ønsker kun at vælge dem, der har været i virksomheden i mere end 5 år for at tilbyde dem en bonus eller yderligere fordele.
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); } }
I dette eksempel oprettes en stream af medarbejdere ved hjælp af stream(). Derefter anvendes filter-metoden til at filtrere medarbejdere med mere end 5 års erfaring.
Resultatet er en ny liste, der kun indeholder de medarbejdere, som opfylder denne betingelse.
Hvornår skal filter anvendes
I de fleste tilfælde er det bedst at bruge filter() i begyndelsen for at reducere mængden af data til efterfølgende operationer. Dette forbedrer ydelsen, da senere operationer udføres på et mindre datasæt.
Eksempel
Hvis du har en liste over medarbejdere og først vil filtrere dem med mere end 5 års erfaring og derefter omdanne de resterende medarbejdere til et andet format, giver det mening at starte med filtrering.
List<Employee> result = employees.stream()
.filter(e -> e.getYearsOfExperience() > 5) // First, `filter`
.map(e -> e.getName()) // Then apply other operations
.toList();
Som det ses i dette eksempel, placeres filter() før map() metoden, da det gør det muligt først at reducere antallet af elementer, der skal behandles. Du filtrerer medarbejdere med mere end 5 års erfaring, og derefter udtrækkes deres navne.
Denne rækkefølge af operationer er effektiv, da den forhindrer unødvendig databehandling under transformationsfasen.
1. Hvad gør filter()-metoden i Stream API?
2. Hvilken type argument accepterer filter()-metoden?
3. Hvad sker der, hvis du bruger en betingelse i filter()-metoden, der altid returnerer false?
Tak for dine kommentarer!