Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Consumer: Bearbetning av Data | Grunder och Funktionella Möjligheter med Stream API
Stream API

bookConsumer: Bearbetning av Data

Du har redan utforskat många funktionella gränssnitt i Java, men vad händer om du behöver utföra en operation som tar ett argument, tillämpar vissa ändringar eller ger en bieffekt—utan att returnera ett resultat? Det är här det funktionella gränssnittet Consumer kommer in.

Consumer-gränssnittet

Det används ofta för att utföra åtgärder som modifierar tillstånd eller ger bieffekter utan att returnera ett värde.

Gränssnittet Consumer är en del av java.util.function package och definieras enligt följande:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

Metoden accept(T t) tar ett objekt av typen T som inmatning och utför en operation på det utan att returnera något resultat.

Praktisk tillämpning

Antag att du har en lista av strängar, och för varje sträng behöver du skriva ut den tillsammans med ett unikt id, separerat med ett mellanslag. Detta kan uppnås med hjälp av gränssnittet Consumer genom att skicka varje sträng tillsammans med dess index (id).

Main.java

Main.java

copy
12345678910111213141516171819
package com.example; import java.util.List; import java.util.function.Consumer; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // Creating a `Consumer` that prints each string with its id Consumer<String> printNameWithId = (name) -> { int id = names.indexOf(name) + 1; // id = index + 1 System.out.println(id + " " + name); }; // Using `Consumer` to print each string with its id names.forEach(printNameWithId); } }

I detta exempel används Consumer för att skriva ut varje sträng från listan med ett unikt identifierare. Id för varje element beräknas med dess index i listan, och resultatet skrivs ut i formatet "id string". Detta möjliggör bearbetning av listelement utan att uttryckligen använda en loop.

Koden kan även förenklas genom att skriva lambda-uttrycket direkt i forEach-loopen:

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // Using `forEach` with a lambda expression to print the ID and name names.forEach(name -> System.out.println((names.indexOf(name) + 1) + " " + name)); } }

Som du kan se förblir resultatet detsamma, medan koden blir mer koncis och lättare att läsa.

Användning av standardmetod

Gränssnittet Consumer innehåller även en standardmetod som möjliggör kombinering av flera operationer.

Metoden andThen() gör det möjligt att kedja två Consumer-operationer tillsammans. Den första Consumer körs först, följt av den andra.

Tänk dig till exempel att du har en lista med namn och vill utföra två uppgifter: skriva ut varje namn i versaler och sedan skriva ut längden på det namnet. Genom att använda andThen() kan du kombinera båda operationerna i en enda Consumer som tillämpar dem sekventiellt.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.List; import java.util.function.Consumer; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // First `Consumer` — prints the name in uppercase Consumer<String> printUpperCase = name -> System.out.print(name.toUpperCase() + " - "); // Second `Consumer` — prints the length of the name Consumer<String> printLength = name -> System.out.println(name.length()); // Combine both `Consumers` using `andThen()` Consumer<String> combinedConsumer = printUpperCase.andThen(printLength); // Apply the combined `Consumer` to each name names.forEach(combinedConsumer); } }

I detta exempel skrivs först namnet ut i versaler, följt av ett bindestreck och namnets längd. Du använder andThen() för att kombinera två Consumer-operationer så att den första skriver ut namnet och den andra skriver ut dess längd.

1. Vad gör metoden andThen() i gränssnittet Consumer?

2. Vilken typ av data tar accept-metoden i gränssnittet Consumer emot?

question mark

Vad gör metoden andThen() i gränssnittet Consumer?

Select the correct answer

question mark

Vilken typ av data tar accept-metoden i gränssnittet Consumer emot?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 11

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

bookConsumer: Bearbetning av Data

Svep för att visa menyn

Du har redan utforskat många funktionella gränssnitt i Java, men vad händer om du behöver utföra en operation som tar ett argument, tillämpar vissa ändringar eller ger en bieffekt—utan att returnera ett resultat? Det är här det funktionella gränssnittet Consumer kommer in.

Consumer-gränssnittet

Det används ofta för att utföra åtgärder som modifierar tillstånd eller ger bieffekter utan att returnera ett värde.

Gränssnittet Consumer är en del av java.util.function package och definieras enligt följande:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

Metoden accept(T t) tar ett objekt av typen T som inmatning och utför en operation på det utan att returnera något resultat.

Praktisk tillämpning

Antag att du har en lista av strängar, och för varje sträng behöver du skriva ut den tillsammans med ett unikt id, separerat med ett mellanslag. Detta kan uppnås med hjälp av gränssnittet Consumer genom att skicka varje sträng tillsammans med dess index (id).

Main.java

Main.java

copy
12345678910111213141516171819
package com.example; import java.util.List; import java.util.function.Consumer; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // Creating a `Consumer` that prints each string with its id Consumer<String> printNameWithId = (name) -> { int id = names.indexOf(name) + 1; // id = index + 1 System.out.println(id + " " + name); }; // Using `Consumer` to print each string with its id names.forEach(printNameWithId); } }

I detta exempel används Consumer för att skriva ut varje sträng från listan med ett unikt identifierare. Id för varje element beräknas med dess index i listan, och resultatet skrivs ut i formatet "id string". Detta möjliggör bearbetning av listelement utan att uttryckligen använda en loop.

Koden kan även förenklas genom att skriva lambda-uttrycket direkt i forEach-loopen:

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // Using `forEach` with a lambda expression to print the ID and name names.forEach(name -> System.out.println((names.indexOf(name) + 1) + " " + name)); } }

Som du kan se förblir resultatet detsamma, medan koden blir mer koncis och lättare att läsa.

Användning av standardmetod

Gränssnittet Consumer innehåller även en standardmetod som möjliggör kombinering av flera operationer.

Metoden andThen() gör det möjligt att kedja två Consumer-operationer tillsammans. Den första Consumer körs först, följt av den andra.

Tänk dig till exempel att du har en lista med namn och vill utföra två uppgifter: skriva ut varje namn i versaler och sedan skriva ut längden på det namnet. Genom att använda andThen() kan du kombinera båda operationerna i en enda Consumer som tillämpar dem sekventiellt.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.List; import java.util.function.Consumer; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // First `Consumer` — prints the name in uppercase Consumer<String> printUpperCase = name -> System.out.print(name.toUpperCase() + " - "); // Second `Consumer` — prints the length of the name Consumer<String> printLength = name -> System.out.println(name.length()); // Combine both `Consumers` using `andThen()` Consumer<String> combinedConsumer = printUpperCase.andThen(printLength); // Apply the combined `Consumer` to each name names.forEach(combinedConsumer); } }

I detta exempel skrivs först namnet ut i versaler, följt av ett bindestreck och namnets längd. Du använder andThen() för att kombinera två Consumer-operationer så att den första skriver ut namnet och den andra skriver ut dess längd.

1. Vad gör metoden andThen() i gränssnittet Consumer?

2. Vilken typ av data tar accept-metoden i gränssnittet Consumer emot?

question mark

Vad gör metoden andThen() i gränssnittet Consumer?

Select the correct answer

question mark

Vilken typ av data tar accept-metoden i gränssnittet Consumer emot?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 11
some-alt