Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Consumer: Elaborazione Dei Dati | Fondamenti e Capacità Funzionali dello Stream API
Stream API

bookConsumer: Elaborazione Dei Dati

Hai già esplorato molte interfacce funzionali in Java, ma cosa succede se è necessario eseguire un'operazione che prende un argomento, applica alcune modifiche o produce un effetto collaterale—senza restituire un risultato? È qui che entra in gioco l'interfaccia funzionale Consumer.

Interfaccia Consumer

Viene comunemente utilizzata per eseguire azioni che modificano lo stato o producono effetti collaterali senza restituire un valore.

L'interfaccia Consumer fa parte del java.util.function package ed è definita come segue:

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

Il metodo accept(T t) riceve un oggetto di tipo T come input ed esegue un'operazione su di esso senza restituire alcun risultato.

Applicazione pratica

Supponiamo di avere un elenco di stringhe e, per ciascuna stringa, sia necessario stampare la stringa insieme a un id univoco, separati da uno spazio. È possibile ottenere questo risultato utilizzando l'interfaccia Consumer, passando ogni stringa insieme al proprio indice (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); } }

In questo esempio, si utilizza Consumer per stampare ogni stringa dalla lista con un identificatore univoco. L'id per ciascun elemento viene calcolato utilizzando il suo indice nella lista, e il risultato viene stampato nel formato "id string". Questo consente di elaborare gli elementi della lista senza utilizzare esplicitamente un ciclo.

È inoltre possibile semplificare il codice scrivendo direttamente l'espressione lambda all'interno del ciclo forEach:

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)); } }

Come puoi vedere, il risultato rimane invariato, mentre il codice diventa più conciso e facile da leggere.

Utilizzo del Metodo Predefinito

L'interfaccia Consumer include anche un metodo predefinito che consente di combinare più operazioni.

Il metodo andThen() permette di concatenare due operazioni Consumer. Il primo Consumer viene eseguito per primo, seguito dal secondo.

Ad esempio, supponi di avere un elenco di nomi e di voler eseguire due operazioni: stampare ogni nome in maiuscolo e poi stampare la lunghezza di quel nome. Utilizzando andThen(), puoi combinare entrambe le operazioni in un unico Consumer che le applica sequenzialmente.

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); } }

In questo esempio, prima si stampa il nome in maiuscolo, seguito da un trattino e dalla lunghezza del nome. Si utilizza andThen() per combinare due operazioni Consumer in modo che la prima stampi il nome e la seconda stampi la sua lunghezza.

1. Cosa fa il metodo andThen() nell'interfaccia Consumer?

2. Che tipo di dato accetta il metodo accept nell'interfaccia Consumer?

question mark

Cosa fa il metodo andThen() nell'interfaccia Consumer?

Select the correct answer

question mark

Che tipo di dato accetta il metodo accept nell'interfaccia Consumer?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 11

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Awesome!

Completion rate improved to 2.33

bookConsumer: Elaborazione Dei Dati

Scorri per mostrare il menu

Hai già esplorato molte interfacce funzionali in Java, ma cosa succede se è necessario eseguire un'operazione che prende un argomento, applica alcune modifiche o produce un effetto collaterale—senza restituire un risultato? È qui che entra in gioco l'interfaccia funzionale Consumer.

Interfaccia Consumer

Viene comunemente utilizzata per eseguire azioni che modificano lo stato o producono effetti collaterali senza restituire un valore.

L'interfaccia Consumer fa parte del java.util.function package ed è definita come segue:

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

Il metodo accept(T t) riceve un oggetto di tipo T come input ed esegue un'operazione su di esso senza restituire alcun risultato.

Applicazione pratica

Supponiamo di avere un elenco di stringhe e, per ciascuna stringa, sia necessario stampare la stringa insieme a un id univoco, separati da uno spazio. È possibile ottenere questo risultato utilizzando l'interfaccia Consumer, passando ogni stringa insieme al proprio indice (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); } }

In questo esempio, si utilizza Consumer per stampare ogni stringa dalla lista con un identificatore univoco. L'id per ciascun elemento viene calcolato utilizzando il suo indice nella lista, e il risultato viene stampato nel formato "id string". Questo consente di elaborare gli elementi della lista senza utilizzare esplicitamente un ciclo.

È inoltre possibile semplificare il codice scrivendo direttamente l'espressione lambda all'interno del ciclo forEach:

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)); } }

Come puoi vedere, il risultato rimane invariato, mentre il codice diventa più conciso e facile da leggere.

Utilizzo del Metodo Predefinito

L'interfaccia Consumer include anche un metodo predefinito che consente di combinare più operazioni.

Il metodo andThen() permette di concatenare due operazioni Consumer. Il primo Consumer viene eseguito per primo, seguito dal secondo.

Ad esempio, supponi di avere un elenco di nomi e di voler eseguire due operazioni: stampare ogni nome in maiuscolo e poi stampare la lunghezza di quel nome. Utilizzando andThen(), puoi combinare entrambe le operazioni in un unico Consumer che le applica sequenzialmente.

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); } }

In questo esempio, prima si stampa il nome in maiuscolo, seguito da un trattino e dalla lunghezza del nome. Si utilizza andThen() per combinare due operazioni Consumer in modo che la prima stampi il nome e la seconda stampi la sua lunghezza.

1. Cosa fa il metodo andThen() nell'interfaccia Consumer?

2. Che tipo di dato accetta il metodo accept nell'interfaccia Consumer?

question mark

Cosa fa il metodo andThen() nell'interfaccia Consumer?

Select the correct answer

question mark

Che tipo di dato accetta il metodo accept nell'interfaccia Consumer?

Select the correct answer

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 1. Capitolo 11
some-alt