Parece que uma classe anônima. I não encontrou qualquer artigo conversa sobre esse uso de lambdas.
public Supplier<Map<Boolean, List<Integer>>> supplier() {
return () -> new HashMap<>() { //todo what does this mean?
{
this.put(false, new ArrayList<>());
this.put(true, new ArrayList<>());
}
};
}
Há uma série de coisas diferentes acontecendo aqui.
O método retorna um Supplier<Map<...>>
. A expressão lambda () -> new HashMap<>() ...
retorna um exemplo da interface Supplier
que retorna um HashMap
.
Além disso, ele não retorna uma planície HashMap
; uma subclasse anônima de HashMap
está sendo criado aqui por causa do exterior { ... }
.
O interior { ... }
é um exemplo inicializador de bloco que é utilizado para colocar o material no HashMap
(duas entradas com teclas true
e false
e cada um ArrayList
como o valor).
Esta é usando o truque de inicialização duplo cinta . (Esse link aponta para um blogpost escrito por mim que explica por que eu não gosto de esse truque).
A melhor maneira de escrever isso (se você estiver usando Java 9 ou mais recente) que não usa o duplo cinta truque inicialização é assim:
public Supplier<Map<Boolean, List<Integer>>> supplier() {
return () -> Map.of(
false, new ArrayList<>(),
true, new ArrayList<>());
}