1 Problemas de inferência com lambdas encadeados
Method reference funciona sem problemas:
usuarios.sort(Comparator.comparingInt(Usuario::getPontos)
.thenComparing(Usuario::getNome));
Lambda equivalente pode não compilar:
usuarios.sort(Comparator.comparingInt(u -> u.getPontos())
.thenComparing(u -> u.getNome())); // Não compila
2 Soluções para compilar lambdas encadeados
Explicitando o tipo no lambda:
usuarios.sort(Comparator.comparingInt((Usuario u) -> u.getPontos())
.thenComparing(u -> u.getNome()));
Quebrando o encadeamento:
Comparator
usuarios.sort(comparator.thenComparing(u -> u.getNome()));
Forçando tipo genérico do método:
usuarios.sort(Comparator.
.thenComparing(u -> u.getNome()));
3 Preferência por method reference
Method reference (Usuario::getPontos) facilita a inferência dos tipos.
Usado principalmente em interfaces fluentes como Comparator.reversed().
Exemplo: método reversed()
usuarios.sort(Comparator.comparingInt(Usuario::getPontos).reversed());
Lambda precisa de tipo explícito:
usuarios.sort(Comparator.comparingInt((Usuario u) -> u.getPontos()).reversed());
Exemplo: ExemploInferenciaEncadeamento.java