DEV Community

FUNDAMENTOS JAVA
FUNDAMENTOS JAVA

Posted on

1

Cap4 - Default Methods

O método forEach na interface Iterable

  • Antes do Java 8: O método forEach não existia.

  • Problema ao adicioná-lo diretamente em List: Todas as classes que implementam List teriam que redefini-lo e bibliotecas como Hibernate poderiam quebrar, gerando NoSuchMethodError.

Default Methods

  • O Java 8 introduziu métodos default em interfaces, permitindo que métodos tenham implementação dentro da própria interface.

  • O método forEach foi adicionado na interface Iterable, que é mãe de Collection e, consequentemente, de List.

default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}

  • Como ArrayList implementa List, ele automaticamente herda forEach.

  • O método recebe um objeto da interface funcional Consumer, que tem o método accept(T t).

  • Exemplo de uso com lambda:

usuarios.forEach(u -> System.out.println(u.getNome()));

A interface Consumer não tem só um método!

  • Uma interface funcional possui apenas um método abstrato.

  • Pode conter métodos default, desde que tenha apenas um método abstrato.

  • A anotação @FunctionalInterface pode ser usada para indicar que uma interface segue essa regra.

A Interface Consumer

  • O Consumer é uma interface funcional do pacote java.util.function.

  • Possui o método abstrato: void accept(T t);

  • Também tem um método default chamado andThen que permite compor múltiplos consumidores, executando-os em sequência:

default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}

Exemplo de Uso do andThen

  • Criamos dois Consumer: Um exibe uma mensagem antes da impressão. Outro imprime o nome do usuário.

  • O andThen permite que ambos sejam aplicados na lista de usuários.

Consumer<Usuario> mostraMensagem = u ->
System.out.println("antes de imprimir os nomes");
Consumer<Usuario> imprimeNome = u ->
System.out.println(u.getNome());
usuarios.forEach(mostraMensagem.andThen(imprimeNome));

Reutilização e o Padrão Decorator

  • Podemos criar implementações reutilizáveis de Consumer.

  • Exemplo: um Consumer auditor que registra logs pode ser usado isoladamente ou combinado com andThen.

  • Essa abordagem se assemelha ao Padrão Decorator, permitindo a composição dinâmica de comportamentos.

Obs.:
O Padrão Decorator é um padrão de projeto estrutural que permite adicionar funcionalidades a um objeto dinamicamente, sem modificar sua estrutura original. Ele encapsula um objeto dentro de outro para estender ou modificar seu comportamento. No exemplo com Consumer, usamos o método andThen para compor múltiplos comportamentos. Isso é semelhante ao Decorator, pois adicionamos novas ações sem modificar o Consumer original.

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay