Commit a7383c30 by Patryk Czarnik

lambdy - ostatnie dodatki

parent ab6def50
package p17_lambdy;
/* Interfejs funkcyjny to taki, który ma jedną metodę anstrakcyjną
/* Interfejs funkcyjny to taki, który ma jedną metodę abstrakcyjną
(czyli pozbawioną implementacji).
Można jednak definiować metody z domyślną implementacją (oznaczone default).
Można też definiować metody statyczne.
Wyrażenia lambda, które są zgodne z nagłówkiem tej metody,
mogą służyć do tworzenia obiektów zgodnych z tym interfejsem.
*/
Przed interfejsem funkcyjnym MOŻEMY, ale nie musimy, wpisać adnotację @FunctionalInterface
*/
@FunctionalInterface
public interface FunkcjaLiczbowa {
double oblicz(double arg);
default int obliczJakoInt(double arg) {
return (int)oblicz(arg);
}
static FunkcjaLiczbowa identycznosc() {
return x -> x;
}
static double nicniezmieniaj(double x) {
return x;
}
static FunkcjaLiczbowa constant(double value) {
return x -> value;
}
}
......@@ -13,5 +13,11 @@ public class MojProgram {
System.out.println(Arrays.toString(a));
MojFrameworkFunkcyjny.zastosujDoTablicy(a, x -> x*x);
System.out.println(Arrays.toString(a));
MojFrameworkFunkcyjny.zastosujDoTablicy(a, FunkcjaLiczbowa.identycznosc());
System.out.println(Arrays.toString(a));
MojFrameworkFunkcyjny.zastosujDoTablicy(a, FunkcjaLiczbowa::nicniezmieniaj);
System.out.println(Arrays.toString(a));
MojFrameworkFunkcyjny.zastosujDoTablicy(a, FunkcjaLiczbowa.constant(5));
System.out.println(Arrays.toString(a));
}
}
......@@ -12,14 +12,27 @@ public class Program {
System.out.println(f3.oblicz(7));
System.out.println("Obiekt f3: " + f3);
System.out.println("Klasa obiektu: " + f3.getClass().getName());
if(f3 instanceof FunkcjaLiczbowa) {
// skoro lambda lest obiektem, to mogę wpisać do zmiennej typu Object
Object o = f3;
// System.out.println(o.oblicz(8));
if(o instanceof FunkcjaLiczbowa) {
System.out.println("Tak, to jest ten typ.");
}
// Jednak nie mogę wpisać lambdy bezpośrednio do zmiennej o
// bo kompilator nie wie w tym miejscu, do jakiego interfejsu ma pasować ta lambda.
// o = y->y-1;
// Aby użyć wyrażenia lambda, z kontekstu musi wynikać, jakiego typu oczekujemy.
o = (FunkcjaLiczbowa) y->y-1;
System.out.println();
FunkcjaLiczbowa f4 = x -> 10*x;
FunkcjaLiczbowa f5 = Math::sqrt;
System.out.println(f4.oblicz(9));
System.out.println(f5.oblicz(16));
System.out.println(f5.oblicz(11));
System.out.println(f5.obliczJakoInt(11));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment