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?

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
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);

    }

}