Olá Lars,
Quando estava estudando este tópico, encontrei um artigo no Blog da Caelum que me ajudou bastante.. vou deixar o link abaixo, mas o trecho que julgo mais importante para tua dúvida é "Para conseguir fazer uma chamada a um method reference é necessário que a invocação de método da direita receba os mesmos parâmetros da esquerda do lambda."
Link do artigo https://blog.caelum.com.br/java-8-lambda-ou-method-reference-entenda-a-diferenca/amp/
Para exemplificar o trecho que destaquei, veja o código abaixo que deve ficar mais claro. O método forEach recebe um Consumer para executar alguma ação a cada iteração e podemos fazer new Consumer diretamente para que por debaixo dos panos seja instanciada uma classe que implementa a interface Consumer (implementação 1). Porém, agora podemos fazer isso com lambdas (implementação 2), mas veja que com o lambda apenas chamamos System.out.println passando como parâmetro o argumento que está a esquerda do lambda e, nesse cenário, podemos usar method reference, apenas chamando System.out::println
package br.com.alura.lambda;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class TesteLambda {
public static void main(String[] args) {
List<String> palavras = new ArrayList<String>();
palavras.add("Ola");
palavras.add("Brasil");
palavras.add("Alura");
palavras.add("Java");
// implementação 1
palavras.forEach(new Consumer<String>() {
@Override
public void accept(String palavra) {
System.out.println(palavra);
}
});
// implementação 2
palavras.forEach(palavra -> System.out.println(palavra));
// implementação 3
palavras.forEach(System.out::println);
}
}