Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Filtrering av element med filter()-metoden | Intermediära Operationer i Stream API
Stream API

bookFiltrering av element med filter()-metoden

När du arbetar med datainsamlingar i Java behöver du ofta extrahera specifika element som uppfyller vissa villkor. Traditionellt kräver detta loopar och villkorssatser, vilket gör koden mer omständlig. Det är här metoden filter() kommer till undsättning.

Du har redan använt denna metod i våra exempel, men vi har ännu inte diskuterat i detalj vad den tar som argument. Den accepterar ett funktionellt gränssnitt Predicate<T>, som definierar om ett element ska inkluderas i den resulterande strömmen.

Stream<T> filter(Predicate<? super T> predicate);

Här är T typen av element i strömmen, och Predicate<? super T> är filtreringsvillkoret som används för att kontrollera varje element.

Praktisk tillämpning

Anta att du har en lista med anställda, där varje har ett name och yearsOfExperience i företaget. Du vill välja endast de som har varit på företaget i mer än 5 år för att erbjuda dem en bonus eller ytterligare förmåner.

Main.java

Main.java

copy
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 det här exemplet skapas en ström av anställda med hjälp av stream(). Därefter används metoden filter för att filtrera anställda som har mer än 5 års erfarenhet.

Resultatet är en ny lista som endast innehåller de anställda som uppfyller detta villkor.

När filter ska användas

I de flesta fall är det bättre att använda filter() i början för att minska mängden data för efterföljande operationer. Detta förbättrar prestandan eftersom senare operationer utförs på en mindre datamängd.

Exempel

Om du har en lista med anställda och först vill filtrera de med mer än 5 års erfarenhet och sedan omvandla de återstående anställda till ett annat format, är det logiskt att börja 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 kan se, i detta exempel placerar du filter() före map()-metoden eftersom det gör att du kan minska antalet element du behöver arbeta med först. Du filtrerar anställda med mer än 5 års erfarenhet och hämtar sedan deras namn.

Denna ordning av operationer är effektiv eftersom den förhindrar onödig databehandling under transformationsfasen.

1. Vad gör metoden filter() i Stream API?

2. Vilken typ av argument accepterar metoden filter()?

3. Vad händer om du använder ett villkor i metoden filter() som alltid returnerar false?

question mark

Vad gör metoden filter() i Stream API?

Select the correct answer

question mark

Vilken typ av argument accepterar metoden filter()?

Select the correct answer

question mark

Vad händer om du använder ett villkor i metoden filter() som alltid returnerar false?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Awesome!

Completion rate improved to 2.33

bookFiltrering av element med filter()-metoden

Svep för att visa menyn

När du arbetar med datainsamlingar i Java behöver du ofta extrahera specifika element som uppfyller vissa villkor. Traditionellt kräver detta loopar och villkorssatser, vilket gör koden mer omständlig. Det är här metoden filter() kommer till undsättning.

Du har redan använt denna metod i våra exempel, men vi har ännu inte diskuterat i detalj vad den tar som argument. Den accepterar ett funktionellt gränssnitt Predicate<T>, som definierar om ett element ska inkluderas i den resulterande strömmen.

Stream<T> filter(Predicate<? super T> predicate);

Här är T typen av element i strömmen, och Predicate<? super T> är filtreringsvillkoret som används för att kontrollera varje element.

Praktisk tillämpning

Anta att du har en lista med anställda, där varje har ett name och yearsOfExperience i företaget. Du vill välja endast de som har varit på företaget i mer än 5 år för att erbjuda dem en bonus eller ytterligare förmåner.

Main.java

Main.java

copy
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 det här exemplet skapas en ström av anställda med hjälp av stream(). Därefter används metoden filter för att filtrera anställda som har mer än 5 års erfarenhet.

Resultatet är en ny lista som endast innehåller de anställda som uppfyller detta villkor.

När filter ska användas

I de flesta fall är det bättre att använda filter() i början för att minska mängden data för efterföljande operationer. Detta förbättrar prestandan eftersom senare operationer utförs på en mindre datamängd.

Exempel

Om du har en lista med anställda och först vill filtrera de med mer än 5 års erfarenhet och sedan omvandla de återstående anställda till ett annat format, är det logiskt att börja 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 kan se, i detta exempel placerar du filter() före map()-metoden eftersom det gör att du kan minska antalet element du behöver arbeta med först. Du filtrerar anställda med mer än 5 års erfarenhet och hämtar sedan deras namn.

Denna ordning av operationer är effektiv eftersom den förhindrar onödig databehandling under transformationsfasen.

1. Vad gör metoden filter() i Stream API?

2. Vilken typ av argument accepterar metoden filter()?

3. Vad händer om du använder ett villkor i metoden filter() som alltid returnerar false?

question mark

Vad gör metoden filter() i Stream API?

Select the correct answer

question mark

Vilken typ av argument accepterar metoden filter()?

Select the correct answer

question mark

Vad händer om du använder ett villkor i metoden filter() som alltid returnerar false?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 2. Kapitel 2
some-alt