Wpis z mikrobloga

#gotojava #java #naukaprogramowania
Zagadka ( ͡º ͜ʖ͡º)
Ale bez ankiety, wolę zobaczyć tutaj dyskusję i argumenty niż nudne odpowiedzi:

Consumer consumerRef = System.out::println;
Consumer consumer = x -> System.out.println(x);

Jaka jest różnica między tymi dwoma kodami? Czy może są równoważne?
  • 21
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

to czy w runtime będzie to samo?


@GotoFinal: Nie da się tego jednoznacznie stwierdzić :). Czytałem dzisiaj rano, jakiś artykuł czy nawet wycinek dokumentacji odnośnie translacji lambd od Goetze z chyba 2014 czy 2016 r. Z tego co on tam napisał (a przynajmniej na tyle na ile ja to zrozumiałem) to w dużym uproszczeniu na etapie kompilacji wyciągane są podstawowe informacje o tym co ta lambda zwraca, co przyjmuje, do
  • Odpowiedz
@63274682374: no tutaj nie przesadzaj, nie mogą zmieniać za dużo - mogą zmieniać reprezentacje lambdy, np aktualnie lambdy to tak wlasciwe dynamicznie generowane anonimowe klasy (nie do końca technicznie poprawna nazwa), ale zostawili sobie miejsce by to zmienić - jednak nie mogą zmienić samego wyniku działania metody - bo to przecież breaking change. Też to czytałem kiedyś ( ͡º ͜ʖ͡º)
  • Odpowiedz
@GotoFinal: Nie no, wyniku działania metody oczywiście, że nie będą zmieniać ale mogą zmienić sposób reprezentacji tego kodu. To nie zawsze musi być "anonimowa klasa" (znowu popiszę się znajomością twojego bloga - już kiedyś się o to z kimś spierałeś)
Dla mnie i tak najważniejsze jest to, że co to będzie jest podejmowane na etapie uruchomienia a nie kompilacji.
  • Odpowiedz
@GotoFinal: Na pewno nie są równoważne, kiedyś w jakimś projekcie zdarzyło mi się, że referencja do funkcji nie dziąłała, a analogiczny zapis z lambdą zadziałał. Czyli różnica musi być.
  • Odpowiedz