Só que não pára por aí. No runtime, segundo a especificação, o valor de uma lambda é uma referência a uma instância de uma classe que implementa a interface funcional desejada. Veja:
The value of a lambda expression is a reference to an instance of a class with the following properties:
The class implements the targeted functional interface type and, if the target type is an intersection type, every other interface type mentioned in the intersection.
Where the lambda expression has type U, for each non-static member method m of U:
If the function type of U has a subsignature of the signature of m, then the class declares a method that overrides m. The method's body has the effect of evaluating the lambda > body, if it is an expression, or of executing the lambda body, if it is a block; if a result is expected, it is returned from the method.
If the erasure of the type of a method being overridden differs in its signature from the erasure of the function type of U, then before evaluating or executing the lambda body, > the method's body checks that each argument value is an instance of a subclass or subinterface of the erasure of the corresponding parameter type in the function type of U; if > not, a ClassCastException is thrown.
The class overrides no other methods of the targeted functional interface type or other interface types mentioned above, although it may override methods of the Object class.
Valeu! Seria legal escrever sobre, eu gostaria de tentar, mas eu sou enrolado para escrever.
Bem que o Max podia fazer uma parte 2 ou mesmo incrementer este post mostrando a parada do -Djdk.internal.lambda.dumpProxyClasses porque eu achei bem massa poder ver estes detalhes!
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
Nossa, Max, acho que eu nunca tinha me feito esta pergunta e seu post foi uma excelente provocação e ponto de partida!
Pesquisando além, olha o que eu descobri:
Como vc disse, expressões lambda não são classes anônimas e o próprio Java nos informa isto.
O compilador realmente transforma a lambda em métodos. O código abaixo...
... Vira isso depois de compilado quando vc roda
javap -c -p App
:Só que não pára por aí. No runtime, segundo a especificação, o valor de uma lambda é uma referência a uma instância de uma classe que implementa a interface funcional desejada. Veja:
Isso dá pra gente atestar assim:
Só que a parte mais legal é que eu descobri através desta resposta que é possível ver como a classe gerada é no runtime usando o seguinte commando:
O código acima geraria estes arquivos:
E rodando
javap -c -p App\$\$Lambda\$1
dá pra gente ver:Isso tudo é muito interessante! Eu testei usando Java 17.
Que massa!!! Só essa sua resposta daria um ótimo artigo!!! Obrigado por compartilhar!!! Abraços!!!!
Wow, excelente. Concordo com o Max. Isso deveria ser um post haha!! E ai, anima?
Valeu! Seria legal escrever sobre, eu gostaria de tentar, mas eu sou enrolado para escrever.
Bem que o Max podia fazer uma parte 2 ou mesmo incrementer este post mostrando a parada do
-Djdk.internal.lambda.dumpProxyClasses
porque eu achei bem massa poder ver estes detalhes!