GotoFinal
#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?
  • Najlepsze
  • Wszystkie komentarze
GotoFinal
GotoFinal Autor
6
@niezielony: no tak właściwe to to, to tak właściwe zawołam innych tutaj i opiszę dokładniej. @63274682374: @nie_tuzinkowy: @Godziu73: @sorhu: @Wyrewolwerowanyrewolwer:
W tym wypadku te kody są inne,
sorhu
sorhu
1
@GotoFinal
Ha! Sprawdziłem to sobie javapem. No ale nie wiem czy można pisać o tym, żeby blokady nie dostać. (⌐ ͡■ ͜ʖ ͡■)
63274682374
63274682374
@niezielony: Mi się obiło o uszy, że był taki sam problem z jedną z metod StringBuildera, ale niestety wtedy nie dociekałem o co dokładnie chodziło ;/

https://bugs.openjdk.java.net/browse/JDK-8162779
niezielony
niezielony
@GotoFinal, @63274682374: Przypomniało mi się, u mnie to się objawiło problemami z przechwytywaniem wyjątku opisanymi tutaj: https://stackoverflow.com/questions/37413106/java-lang-nullpointerexception-is-thrown-using-a-method-reference-but-not-a-lamb/37413546#37413546
Więc zostawiłem lambdę i w sumie nie drązyłem tematu dalej. Ale nie wiem @GotoFinal czy dokładnie o to Ci chodziło, czy może miałeś coś innego na myśli.
Wyrewolwerowanyrewolwer
@GotoFinal:
W pierwszym masz referencję do funkcji/metody, w drugim całą funkcję, o ile dobrze pamiętam.
W zasadzie jak zawsze, odpowiedź: "to zależy" byłaby prawidłowa bo pewnie po optymalizacjach przeszłoby do tej samej formy.
???
GotoFinal
GotoFinal Autor
0
@Wyrewolwerowanyrewolwer: no właśnie o to jest pytanie, czy można to traktować jako to samo w runtime.
GotoFinal
GotoFinal Autor
0
@sorhu: ja nie blokuje, najwyżej usunę ( ͡º ͜ʖ͡º) ale pytanie czy dobrze sprawdziłeś, to czy w runtime będzie to samo?
n.....y
n.....y
@GotoFinal: method reference uzywa lambda expression wiec o jedno wywolanie wiecej w przypadku JIT zrobi po wielu wywolaniach np 2000 optymalizacje ???
GotoFinal
GotoFinal Autor
0
@nie_tuzinkowy: w pytaniu nie chodzi o jakiekolwiek różnice wydajnościowe itd, tylko czy obie funkcje używane w kodzie dają gwarancje że wynik zawsze będzie ten sam.
Godziu73
@GotoFinal: chyba tak
n.....y
n.....y
@GotoFinal:

It's called a "method reference" and it's a syntactic sugar for expressions like this:


Odpowiedź sama się nasuwa.
GotoFinal
GotoFinal Autor
0
@nie_tuzinkowy: tylko czy poprawna ( ͡º ͜ʖ͡º)
63274682374
63274682374
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
n.....y
n.....y
@63274682374: pokaż artykuł, bo coś czuje ze ferment siejesz :)
GotoFinal
GotoFinal Autor
0
@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ś ( ͡º ͜ʖ͡º)
63274682374
63274682374
@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.
GotoFinal
GotoFinal Autor
0
@63274682374: no ale tutaj właśnie jest pytanie o runtime, czy ma znaczenie którego zapisu użyje od strony logiki kodu.
63274682374
63274682374
@GotoFinal: To pomijając te niskopoziomowe szczegóły odnośnie reprezentacji lambdy według mojej obecnej (małej) wiedzy o lambdach to funkcjonalnie te dwa zapisy są sobie równoważne.
63274682374
63274682374
niezielony
niezielony
@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ć.