Filtrering av Elementer med Filter()-Metoden
Når du arbeider med datakollekjoner i Java, trenger du ofte å hente ut spesifikke elementer som oppfyller visse betingelser. Tradisjonelt krever dette løkker og betingede uttrykk, noe som gjør koden mer omstendelig. Det er her filter()-metoden kommer til unnsetning.
Du har allerede brukt denne metoden i våre eksempler, men vi har ikke diskutert i detalj hva den tar som argument. Den aksepterer et funksjonelt grensesnitt Predicate<T>, som definerer om et element skal inkluderes i den resulterende strømmen.
Stream<T> filter(Predicate<? super T> predicate);
Her er T typen til elementene i strømmen, og Predicate<? super T> er filtreringsbetingelsen som brukes for å sjekke hvert element.
Praktisk anvendelse
Anta at du har en liste over ansatte, hver med et name og yearsOfExperience i selskapet. Du ønsker å velge kun de som har vært i selskapet i mer enn 5 år for å tilby dem en bonus eller ekstra fordeler.
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 eksempelet oppretter du en stream av ansatte ved å bruke stream(). Deretter bruker du filter-metoden for å filtrere ansatte som har mer enn 5 år med erfaring.
Resultatet er en ny liste som kun inneholder de ansatte som oppfyller denne betingelsen.
Når bruke filter
I de fleste tilfeller er det bedre å bruke filter() i begynnelsen for å redusere mengden data for påfølgende operasjoner. Dette forbedrer ytelsen siden senere operasjoner vil bli utført på et mindre datasett.
Eksempel
Hvis du har en liste over ansatte og ønsker å først filtrere de med mer enn 5 år med erfaring og deretter transformere de gjenværende ansatte til et annet format, er det fornuftig å 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 du ser i dette eksempelet, plasseres filter() før map()-metoden fordi det lar deg redusere antall elementer du må arbeide med først. Du filtrerer ansatte med mer enn 5 års erfaring, og deretter henter du deres navn.
Denne rekkefølgen av operasjoner er effektiv fordi den forhindrer unødvendig databehandling under transformasjonsfasen.
1. Hva gjør filter()-metoden i Stream API?
2. Hvilken type argument aksepterer filter()-metoden?
3. Hva skjer hvis du bruker en betingelse i filter()-metoden som alltid returnerer false?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
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 av Elementer med Filter()-Metoden
Sveip for å vise menyen
Når du arbeider med datakollekjoner i Java, trenger du ofte å hente ut spesifikke elementer som oppfyller visse betingelser. Tradisjonelt krever dette løkker og betingede uttrykk, noe som gjør koden mer omstendelig. Det er her filter()-metoden kommer til unnsetning.
Du har allerede brukt denne metoden i våre eksempler, men vi har ikke diskutert i detalj hva den tar som argument. Den aksepterer et funksjonelt grensesnitt Predicate<T>, som definerer om et element skal inkluderes i den resulterende strømmen.
Stream<T> filter(Predicate<? super T> predicate);
Her er T typen til elementene i strømmen, og Predicate<? super T> er filtreringsbetingelsen som brukes for å sjekke hvert element.
Praktisk anvendelse
Anta at du har en liste over ansatte, hver med et name og yearsOfExperience i selskapet. Du ønsker å velge kun de som har vært i selskapet i mer enn 5 år for å tilby dem en bonus eller ekstra fordeler.
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 eksempelet oppretter du en stream av ansatte ved å bruke stream(). Deretter bruker du filter-metoden for å filtrere ansatte som har mer enn 5 år med erfaring.
Resultatet er en ny liste som kun inneholder de ansatte som oppfyller denne betingelsen.
Når bruke filter
I de fleste tilfeller er det bedre å bruke filter() i begynnelsen for å redusere mengden data for påfølgende operasjoner. Dette forbedrer ytelsen siden senere operasjoner vil bli utført på et mindre datasett.
Eksempel
Hvis du har en liste over ansatte og ønsker å først filtrere de med mer enn 5 år med erfaring og deretter transformere de gjenværende ansatte til et annet format, er det fornuftig å 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 du ser i dette eksempelet, plasseres filter() før map()-metoden fordi det lar deg redusere antall elementer du må arbeide med først. Du filtrerer ansatte med mer enn 5 års erfaring, og deretter henter du deres navn.
Denne rekkefølgen av operasjoner er effektiv fordi den forhindrer unødvendig databehandling under transformasjonsfasen.
1. Hva gjør filter()-metoden i Stream API?
2. Hvilken type argument aksepterer filter()-metoden?
3. Hva skjer hvis du bruker en betingelse i filter()-metoden som alltid returnerer false?
Takk for tilbakemeldingene dine!