Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Consumer: Processamento de Dados | Fundamentos e Capacidades Funcionais da Stream API
Stream API

bookConsumer: 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

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

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

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

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

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

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?

question mark

O que o método andThen() na interface Consumer faz?

Select the correct answer

question mark

Que tipo de dado o método accept na interface Consumer recebe?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 11

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Suggested prompts:

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

bookConsumer: 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

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

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

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

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

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

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?

question mark

O que o método andThen() na interface Consumer faz?

Select the correct answer

question mark

Que tipo de dado o método accept na interface Consumer recebe?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 11
some-alt