1
resposta

Qual o requisito para conseguir isso

Boa tarde, estou seguindo o curso de java8.

Neste trecho de codigo:

palavras.sort(Comparator.comparing(String::length))

Pq não consigo fazer o mesmo com a classe Comparator? Por exemplo:

palavras.sort(Comparator::comparing(String::length))

é possivel fazer algo assim ou metodos referece não recebem atributos?

Outra coisa existe algum requisito para conseguir usar method reference ma classe, como fizemos na classe String?

1 resposta

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);

    }

}