Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Filtrering av Elementer med Filter()-Metoden | Intermediære Operasjoner i Stream API
Stream-API

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

Main.java

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
package 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?

question mark

Hva gjør filter()-metoden i Stream API?

Velg det helt riktige svaret

question mark

Hvilken type argument aksepterer filter()-metoden?

Velg det helt riktige svaret

question mark

Hva skjer hvis du bruker en betingelse i filter()-metoden som alltid returnerer false?

Velg det helt riktige svaret

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

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

Main.java

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
package 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.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 2. Kapittel 2
some-alt