2
respostas

Comparator.comparing

Pessoal, não compreendi o código:

palavras.sort(Comparator.comparing(s -> s.length()));

Uma expressão lamba é uma function? Se sim, como o dev consegue identificar qual expressão lambda inserir? Veja só, se o método comparing pede uma Function, não deveria ser passada uma expressão lambda referente ao método abstrado R apply(T t); da Interface Function ? Como o java entende isso ? A parte que se escreve menos código, ficou claro, mas esse código mais enxuto não me parece legível.

Desde já agradeço a ajuda!

2 respostas

Olá Alex, tudo bem com você?

Function é uma interface funcional e a expressão lambda funciona como a implementação dessa interface. Basicamente, uma forma de diminuir a complexidade de ter que criar toda uma estrutura de uma classe anônima só para poder implementar um único comportamento.

Se formos checar a documentação que mostra as interfaces funcionais do Java, disponível nesse LINK. Podemos ver que a descrição de interface Function<T,R> representa uma função que aceita um argumento e produz um resultado e, como você já mencionou, tudo isso é feito através do método apply(T t) que vai receber um argumento de um tipo e retornar algum outro resultado de outro tipo.

No caso dessa expressão lambda:

palavras.sort(Comparator.comparing(s -> s.length()));

Ela já tem disponível o tipo T do argumento que o Function<T,R>/apply(T t) deve receber que ela pegou dos elementos da coleção palavras. Em relação ao retorno R, o próprio Java já infere o tipo do resultado de acordo com o valor retornado.

Faz sentido? Se algum ponto não ficou legal, avisa aí! ;)

Olá Thiago! Obrigado pelo retorno, meu caro!

Legal, a sua explicação já clareou um pouco mais... : )

Então, a utilização de lambda só vale para interfaces funcionais, beleza!

E se uma interface é funcional, significa, que posso utilizar lambda, e para utilizar a lambda basta implementar o único método abstrato dessa interface, beleza! Então assim, a assinatura do método em si é "praticamente ignorada", pois o que deve ser observado não é o método em si, e sim o método funcional da interface que é passada como parâmetro no método chamado... Veja:

Ex: assinatura do método comparing:

comparing​(Function<? super T,​? extends U> keyExtractor): Comparator - Comparator

Esse método recebe uma Function, Function é uma Interface funcional, então dentro do método comparing implemento o método abstrato da Interface Function

R apply​(T t)

Se eu estiver equivocado até aqui, por favor me corrija !!! : )

Agora, Thiago, no eclipse, ao programar, ele vai exibindo o javadoc do método/classe enquanto se digita... No caso a IDE exibe a assinatura do método comparing comparing​(Function<? super T,​? extends U> keyExtractor): Comparator - Comparator, você consegue apenas pela assinatura identificar que aqui se pode utilizar lambda ? Ou é um aprendizado que vai acontecendo de visitar o javadoc, e quando você programa você já sabe que Function é uma interface, e por ser uma interface, você pode usar lambda?

Outra coisa Thiago, a documentação do javadoc, tem muitos caracteres 'especiais', <?,T,U,R,super>... etc. Existe algum curso/aula(s) aqui na Alura demonstrando na prática como interpretar a documentação ? Por que durante as aulas, os instrutores até mostraram ela, mas não como interpretar ela na essência...