2014-12-19, 12:59
  #1
Medlem
Diamondgrits avatar
Hej...

Hur mycket kan man misshandla lambda som finns i Java 8? Kan man låta funktionsanrop se ut som variabler?
Dvs. kan man skriva typ

Kod:
a=()->{return 3;};
int i=a
Och då vid tilldelningen av i få ut värdet 3? Jag vet att det inte går att skriva som ovan, men motsvarande?
Jag vill slippa skriva a.get();.
Citera
2014-12-24, 12:44
  #2
Medlem
Nej du måste ju göra ett anrop någonstans för att exekveringen ska starta.
Hur ska annars interpretatorn veta när du vill exekvera funktionen, på rad ett eller två?
Du menar att tilldelningen automatiskt borde räkna ut att eftersom i är ett heltal så vill den göra anropet och tilldelas resultat av anropet, ja det borde kunna gå men nej, det funkar inte i java 8.
Känns ändå bättre som det är nu där anrop är anrop och tilldelning är tilldelning, eller vad tror du?
Citera
2015-01-07, 13:28
  #3
Medlem
Diamondgrits avatar
Citat:
Ursprungligen postat av zikac
Nej du måste ju göra ett anrop någonstans för att exekveringen ska starta.
Hur ska annars interpretatorn veta när du vill exekvera funktionen, på rad ett eller två?
Du menar att tilldelningen automatiskt borde räkna ut att eftersom i är ett heltal så vill den göra anropet och tilldelas resultat av anropet, ja det borde kunna gå men nej, det funkar inte i java 8.
Känns ändå bättre som det är nu där anrop är anrop och tilldelning är tilldelning, eller vad tror du?
Tack för att du tog dig tid att svara på julafton och allt

Nä, nu har jag studerat lambdauttryck lite närmre och förstår bättre hur de fungerar. Jag gillar dem skarpt, trots att de inte klarar av det jag ville i trådstarten!
Citera
2015-02-17, 15:09
  #4
Medlem
Diamondgrits avatar
Eller helt gay att inte detta funkar alltså

Kod:
a=()->{return 3;};
int i=a(); 
Citera
2015-02-17, 19:59
  #5
Medlem
Citat:
Ursprungligen postat av Diamondgrit
Eller helt gay att inte detta funkar alltså

Kod:
a=()->{return 3;};
int i=a(); 
Varför borde det där fungera tycker du?
Ett lambda expression är ju knyten till metod. Vilken metod ska jvm'n kalla på i detta fall? Och hur vet den det?
Extempel:
Kod:
new Thread(()->{System.out.println("foo"};); 
I detta fall vet jvm'n att man implementerar Runnable.run. Men dit fall är en annan femma.
Citera
2015-02-18, 10:10
  #6
Medlem
Diamondgrits avatar
Citat:
Ursprungligen postat av Un-named
Varför borde det där fungera tycker du?
Ett lambda expression är ju knyten till metod. Vilken metod ska jvm'n kalla på i detta fall? Och hur vet den det?
Extempel:
Kod:
new Thread(()->{System.out.println("foo"};); 
I detta fall vet jvm'n att man implementerar Runnable.run. Men dit fall är en annan femma.
Lambdan är knuten till en (och endast en) metod, så vad menar du med "vilken metod ska JVM kalla på"? Den metoden såklart.
Citera
2015-05-02, 13:21
  #7
Medlem
Citat:
Ursprungligen postat av Diamondgrit
Eller helt gay att inte detta funkar alltså

Kod:
a=()->{return 3;};
int i=a(); 
Såhär behöver du skriva för att få det du vill:
Kod:
Callable<Integer= () -> { return 3; };
int i a.call(); 
Eller skapa ett eget functional interface om inte Callable, Runnable, Function, Consumer, Producer osv. passar.
Citera
2015-05-04, 10:10
  #8
Medlem
Diamondgrits avatar
Citat:
Ursprungligen postat av zikac
Såhär behöver du skriva för att få det du vill:
Kod:
Callable<Integer= () -> { return 3; };
int i a.call(); 
Eller skapa ett eget functional interface om inte Callable, Runnable, Function, Consumer, Producer osv. passar.
Jo, jag vet, klart att man kan anropa den bundna metoden. Det jag efterlyser är bara syntaktiskt socker, en genväg för att anropa metoden direkt istället för att behöva skriva dess namn.
Citera
2015-05-08, 12:53
  #9
Medlem
Citat:
Ursprungligen postat av Diamondgrit
Jo, jag vet, klart att man kan anropa den bundna metoden. Det jag efterlyser är bara syntaktiskt socker, en genväg för att anropa metoden direkt istället för att behöva skriva dess namn.
Hur skulle det syntaktiska socket fungera om objektet har fler metoder än den som implementerar det funktionella gränssnittet, eller om fler än ett implementeras?
Citera
2015-05-08, 14:13
  #10
Medlem
Diamondgrits avatar
Citat:
Ursprungligen postat av zikac
Hur skulle det syntaktiska socket fungera om objektet har fler metoder än den som implementerar det funktionella gränssnittet, eller om fler än ett implementeras?
Typen i uttrycket. Man kan ju kräva att uttrycket man försöker anropa bara har en möjlig metod i hierarkin.

dvs. om min klass A implementerar Runnable och Callable, och jag sedan skapar ett objekt a av den klassen, så måste jag antingen casta om som

Kod:
((Runnable)a)(); 

eller mer troligt, skicka in/göra om till en annan variabel

Kod:
void metod(Runnable b)
{
   
b();
}

metod(a); 

Eftersom kompilatorn ser hierarkin borde den kunna ge kompileringsfel om jag gör

Kod:
a(); 

Om A däremot implementerar Runnable och Predicate borde det ju inte vara några problem med att hitta rätt om detta görs:

Kod:
a();
a(null); 
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in