Consumer: Processamento de Dados
Você já explorou muitas interfaces funcionais em Java, mas e se for necessário realizar uma operação que recebe um argumento, aplica algumas alterações ou produz um efeito colateral—sem retornar um resultado? É nesse contexto que a interface funcional Consumer é utilizada.
Interface Consumer
É comumente utilizada para realizar ações que modificam o estado ou produzem efeitos colaterais sem retornar um valor.
A interface Consumer faz parte do java.util.function package e é definida da seguinte forma:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
O método accept(T t) recebe um objeto do tipo T como entrada e executa uma operação sobre ele sem retornar um resultado.
Aplicação Prática
Considere uma lista de strings, e para cada string, é necessário imprimi-la junto com um id único, separados por um espaço. Isso pode ser realizado utilizando a interface Consumer, passando cada string juntamente com seu índice (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); } }
Neste exemplo, utiliza-se o Consumer para imprimir cada string da lista com um identificador único. O id de cada elemento é calculado usando seu índice na lista, e o resultado é exibido no formato "id string". Isso permite processar elementos da lista sem utilizar explicitamente um laço.
Também é possível simplificar o código escrevendo a expressão lambda diretamente dentro do laço forEach:
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)); } }
Como você pode ver, o resultado permanece o mesmo, com o código se tornando mais conciso e fácil de ler.
Utilizando o Método Default
A interface Consumer também inclui um método default que permite combinar múltiplas operações.
O método andThen() possibilita encadear duas operações Consumer. O primeiro Consumer é executado primeiro, seguido pelo segundo.
Por exemplo, imagine que você tem uma lista de nomes e deseja realizar duas tarefas: imprimir cada nome em maiúsculas e, em seguida, imprimir o comprimento desse nome. Utilizando o andThen(), é possível combinar ambas as operações em um único Consumer que as aplica sequencialmente.
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); } }
Neste exemplo, primeiro imprime o nome em maiúsculas, seguido por um traço e o comprimento do nome. Utiliza-se andThen() para combinar duas operações de Consumer, de modo que a primeira imprime o nome e a segunda imprime seu comprimento.
1. O que o método andThen() na interface Consumer faz?
2. Que tipo de dado o método accept na interface Consumer recebe?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
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: Processamento de Dados
Deslize para mostrar o menu
Você já explorou muitas interfaces funcionais em Java, mas e se for necessário realizar uma operação que recebe um argumento, aplica algumas alterações ou produz um efeito colateral—sem retornar um resultado? É nesse contexto que a interface funcional Consumer é utilizada.
Interface Consumer
É comumente utilizada para realizar ações que modificam o estado ou produzem efeitos colaterais sem retornar um valor.
A interface Consumer faz parte do java.util.function package e é definida da seguinte forma:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
O método accept(T t) recebe um objeto do tipo T como entrada e executa uma operação sobre ele sem retornar um resultado.
Aplicação Prática
Considere uma lista de strings, e para cada string, é necessário imprimi-la junto com um id único, separados por um espaço. Isso pode ser realizado utilizando a interface Consumer, passando cada string juntamente com seu índice (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); } }
Neste exemplo, utiliza-se o Consumer para imprimir cada string da lista com um identificador único. O id de cada elemento é calculado usando seu índice na lista, e o resultado é exibido no formato "id string". Isso permite processar elementos da lista sem utilizar explicitamente um laço.
Também é possível simplificar o código escrevendo a expressão lambda diretamente dentro do laço forEach:
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)); } }
Como você pode ver, o resultado permanece o mesmo, com o código se tornando mais conciso e fácil de ler.
Utilizando o Método Default
A interface Consumer também inclui um método default que permite combinar múltiplas operações.
O método andThen() possibilita encadear duas operações Consumer. O primeiro Consumer é executado primeiro, seguido pelo segundo.
Por exemplo, imagine que você tem uma lista de nomes e deseja realizar duas tarefas: imprimir cada nome em maiúsculas e, em seguida, imprimir o comprimento desse nome. Utilizando o andThen(), é possível combinar ambas as operações em um único Consumer que as aplica sequencialmente.
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); } }
Neste exemplo, primeiro imprime o nome em maiúsculas, seguido por um traço e o comprimento do nome. Utiliza-se andThen() para combinar duas operações de Consumer, de modo que a primeira imprime o nome e a segunda imprime seu comprimento.
1. O que o método andThen() na interface Consumer faz?
2. Que tipo de dado o método accept na interface Consumer recebe?
Obrigado pelo seu feedback!