Consumer: Databehandling
Du har allerede udforsket mange funktionelle grænseflader i Java, men hvad nu hvis du skal udføre en operation, der tager et argument, anvender nogle ændringer eller forårsager en sideeffekt—uden at returnere et resultat? Dette er, hvor den funktionelle grænseflade Consumer anvendes.
Consumer-grænseflade
Den bruges ofte til at udføre handlinger, der ændrer tilstand eller forårsager sideeffekter uden at returnere en værdi.
Consumer-grænsefladen er en del af java.util.function package og er defineret som følger:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Metoden accept(T t) modtager et objekt af typen T som input og udfører en operation på det uden at returnere et resultat.
Praktisk anvendelse
Antag, at du har en liste af strenge, og for hver streng skal du udskrive den sammen med et unikt id, adskilt af et mellemrum. Dette kan opnås ved at bruge Consumer-interfacet, hvor hver streng gives sammen med dens indeks (id).
Main.java
12345678910111213141516171819package 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 dette eksempel anvendes Consumer til at udskrive hver streng fra listen med en unik identifikator. Id'et for hvert element beregnes ud fra dets indeks i listen, og resultatet udskrives i formatet "id string". Dette muliggør behandling af listeelementer uden eksplicit brug af en løkke.
Koden kan også forsimples ved at skrive lambda-udtrykket direkte i forEach-løkken:
Main.java
123456789101112package 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, forbliver resultatet det samme, mens koden bliver mere kortfattet og nemmere at læse.
Brug af standardmetode
Consumer-interfacet indeholder også en standardmetode, der muliggør kombination af flere operationer.
Metoden andThen() gør det muligt at kæde to Consumer-operationer sammen. Den første Consumer udføres først, efterfulgt af den anden.
Forestil dig for eksempel, at du har en liste af navne, og du ønsker at udføre to opgaver: udskrive hvert navn med store bogstaver og derefter udskrive længden af navnet. Ved at bruge andThen() kan du kombinere begge operationer i én Consumer, der anvender dem sekventielt.
Main.java
12345678910111213141516171819202122package 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 dette eksempel udskrives først navnet med store bogstaver, efterfulgt af en bindestreg og navnets længde. Du bruger andThen() til at kombinere to Consumer-operationer, så den første udskriver navnet, og den anden udskriver dets længde.
1. Hvad gør andThen()-metoden i Consumer-interfacet?
2. Hvilken type data tager accept-metoden i Consumer-interfacet imod?
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 show an example of using the Consumer interface with a list?
How does the andThen() method work in practice?
What are some common use cases for the Consumer interface?
Awesome!
Completion rate improved to 2.33
Consumer: Databehandling
Stryg for at vise menuen
Du har allerede udforsket mange funktionelle grænseflader i Java, men hvad nu hvis du skal udføre en operation, der tager et argument, anvender nogle ændringer eller forårsager en sideeffekt—uden at returnere et resultat? Dette er, hvor den funktionelle grænseflade Consumer anvendes.
Consumer-grænseflade
Den bruges ofte til at udføre handlinger, der ændrer tilstand eller forårsager sideeffekter uden at returnere en værdi.
Consumer-grænsefladen er en del af java.util.function package og er defineret som følger:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Metoden accept(T t) modtager et objekt af typen T som input og udfører en operation på det uden at returnere et resultat.
Praktisk anvendelse
Antag, at du har en liste af strenge, og for hver streng skal du udskrive den sammen med et unikt id, adskilt af et mellemrum. Dette kan opnås ved at bruge Consumer-interfacet, hvor hver streng gives sammen med dens indeks (id).
Main.java
12345678910111213141516171819package 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 dette eksempel anvendes Consumer til at udskrive hver streng fra listen med en unik identifikator. Id'et for hvert element beregnes ud fra dets indeks i listen, og resultatet udskrives i formatet "id string". Dette muliggør behandling af listeelementer uden eksplicit brug af en løkke.
Koden kan også forsimples ved at skrive lambda-udtrykket direkte i forEach-løkken:
Main.java
123456789101112package 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, forbliver resultatet det samme, mens koden bliver mere kortfattet og nemmere at læse.
Brug af standardmetode
Consumer-interfacet indeholder også en standardmetode, der muliggør kombination af flere operationer.
Metoden andThen() gør det muligt at kæde to Consumer-operationer sammen. Den første Consumer udføres først, efterfulgt af den anden.
Forestil dig for eksempel, at du har en liste af navne, og du ønsker at udføre to opgaver: udskrive hvert navn med store bogstaver og derefter udskrive længden af navnet. Ved at bruge andThen() kan du kombinere begge operationer i én Consumer, der anvender dem sekventielt.
Main.java
12345678910111213141516171819202122package 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 dette eksempel udskrives først navnet med store bogstaver, efterfulgt af en bindestreg og navnets længde. Du bruger andThen() til at kombinere to Consumer-operationer, så den første udskriver navnet, og den anden udskriver dets længde.
1. Hvad gør andThen()-metoden i Consumer-interfacet?
2. Hvilken type data tager accept-metoden i Consumer-interfacet imod?
Tak for dine kommentarer!