Limitações da inferência no lambda
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 comparator = Comparator.comparing(u -> u.getPontos()); usuarios.sort(comparator.thenComparing(u -> u.getNome())); Forçando tipo genérico do método: usuarios.sort(Comparator.comparingInt(u -> u.getPontos()) .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

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