Wpis z mikrobloga

O co chodzi z wyrażeniami lambda? Czytam te wyjaśnienia, tutoriale, oglądam przyklady prawie nic nie idzie do przodu jeśli chodzi o rozumienie tego ( ͡° ʖ̯ ͡°) Każdy wyjaśnia inaczej ehh Rozumiem tyle że to ma na celu skrócenie kodu, wykorzystuje funkcję (raz widziałem klasę z f. statyczną, innym razem interfejs z normalną)
Np taki kod

interface Addable{
int add(int a,int b);
}

public class LambdaExpressionExample6 {
public static void main(String[] args) {

// Lambda expression without return keyword.
Addable ad1=(a,b)->(a+b);
System.out.println(ad1.add(10,20));

// Lambda expression with return keyword.
Addable ad2=(int a,int b)->{
return (a+b);
};
System.out.println(ad2.add(100,200));
}
}

tworzy się obiekt ad1 na podstawie interfejsu Addable, nadaje się funkcji add treść (która będzie działać tylko dla ad1, dla ad2 może być to już zupełnie inna funkcja) i się linijkę niżej odpala funkcję add.
A co się stało tutaj?


rozumiem że lambda bez interfejsu albo klasy statycznej nie zadziała? czyli w tym drugim kodzie musi być interfejs reduce?


Tego można użyć jak się już nada funkcji treść kodem numer 2? Ale gdzie tu argumenty (no bo z tego co rozumiem trzeba przekazać argumenty left i right)?

#ehhhhhhhhhhhhh #java #naukaprogramowania #programowanie
PS jak dodać blok tekstu do spoilera?
  • 11
@Bruno_: Najprosciej mowiac lambda to anonimowa implementacja interfejsu z jedna metoda abstrakcyjna. Jak wczesniej byly tylko klasy anonimowe, tak teraz moga one zostac zastapione przez lambdy:

// Bez lambd
Predicate isBlank = new Predicate() {
public boolean test(String s) {
return s.trim().isEmpty();
}
}

// z lambda
Predicate isBlank = s -> s.trim().isEmpty();
@Bruno_:
java.util.function.IntSupplier#getAsInt
nie przyjmuje żadnego argumentu w przeciwieństwie do
int add(int a);

gdyby obie metody miały identyczne wejście i wyjście (ilość argumentów i typy) wtedy ten zapis by zadziałał
czemu ... daję błąd a ... nie?


@Bruno_: referencje do metod to trochę "skrót myślowy", bo w praktyce można oznaczać aż 4 różne rzeczy, zobacz sobie sposoby użycia z tutorialu oracle https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html (tabelka)
a jeśli potrzebujesz totalnego wprowadzenia do lambd, poszukaj na YT jakiś prezentacji gościa co się zwie Venkat Subramanian o wprowadzeniu do programowania funkcyjnego - i cóż że z Indii, skoro kumaty, znany ewangelista tego podejścia
suma sum = (int a) -> {return a*a;};


@Bruno_: Poza tym w lambdach nie podajesz typu argumentu - jest on wnioskowany z typu pod ktory podstawiana jest lambda, czyli nie (int a) -> ..., tylko po prostu a -> ...
suma sum = (int a) -> {return a*a;};

@Bruno_: Poza tym w lambdach nie podajesz typu argumentu - jest on wnioskowany z typu pod ktory podstawiana jest lambda, czyli nie (int a) -> ..., tylko po prostu a -> ..


to ja jeszcze dodam, że jeżeli ciało wyrażenia lambda zawiera tylko zwracaną wartość to nie trzeba omiatać jej nawiasami klamrowymi, czyli dodając to do tego co napisał @Kresse mamy a->a*a;