DEV Community

FUNDAMENTOS JAVA
FUNDAMENTOS JAVA

Posted on

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.

Top comments (0)