Lambda ifadeleri Java'da nasıl nesnelerdir? [çiftleme]
Java'da lambda ifade nesneleri nasıldır? Nesne yönelimli bir dil olan Java'da işlevsel programlamanın bir parçası olan lambda ifadeleri nasıl uygulanabilir? Lambda ifadelerini anlamak için hangi Java kavramlarına ihtiyacım var?
Yanıtlar
Birkaç şeyi anlamanız gerekir:
1) İşlevsel arayüz
- yalnızca bir genel yöntemi olan arayüz
public interface Runnable{
void run();
}
- bu işlevsel arayüz örneğidir, int gibi farklı yöntemlere sahip olabilir
processNumber(int number) - sadece tek bir yöntem olabileceğini unutmayın (uygulanmayan bir yöntem, varsayılanlar sayılmaz)
2) İşlevsel arayüzü kullanma
- fonksiyonel arayüzünüzü sınıfınızda uygulayabilirsiniz diyelim MyRunnable
public class MyRunnable implements Runnable{
public void run(){
System.out.println("Hello world");
}
}
- MyRunnable sınıfınızı başka bir yöntemde geçirebileceğinizden, normal nesnesi
public class MyClass{
public void myMethod(Runnable runnable){
runnable.run();
}
}
- bu "Merhaba dünya" yazdırır
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new MyRunnable());
}
3) Lambda ne yapıyor?
- lambda'nın yapmanıza izin verdiği şey, arayüzün anonim uygulamasını oluşturmaktır.
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(() -> System.out.println("Hello my world"));
}
- bu "Merhaba dünyam" yazardı
- Sadece Runnable'ın anonim uygulamasını oluşturuyorsunuz ve bunu MyMethod'a geçiriyorsunuz
- bunun için sadece sözdizimsel şeker
public static void main{
MyClass myClass = new MyClass();
myClass.myMethod(new Runnable{
public void run(){
System.out.println("Hello my world");
});
}
Java'daki bir lambda, temelde sadece işlevsel bir arayüzdür . Çoğunlukla sözdizimsel şekerdir .
Java işlevsel bir dil değildir ve bu nedenle işlevsel programlamayı tam olarak uygulayamaz, yalnızca temel ilkelerinin bir alt kümesini. Örneğin , Java'da doğru tip sınıflarını uygulayamazsınız .
Her durumda, FP için standart bir tanım yoktur, tıpkı OOP için standart bir tanım olmaması gibi. Spesifik tanım, kaynaklara bağlı olarak değişebilir, ancak genel fikirler (genellikle) aynıdır.
Java, Nesne Tabanlı bir Dildir. Ancak işlevsel dillerin bazı özellikleri, lambda gibi javada da mevcuttur.
lambda temelde bir işlev gibi davranan bir nesnedir. belgeler:https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html
her zamanki gibi bir fonksiyonun bir girişi ve bir çıkışı vardır
işlevlerdeki girdiler: T olarak anılır (alışta olduğu gibi)
işlevdeki çıktılar: R olarak adlandırılır (karşılığında olduğu gibi)
beyanname yapısı: Function<T,R> var_name = input_variables -> output_expression
misal : Function<Double,Double> Sigmoid = x->(1/( 1 + Math.pow(Math.E,(-1*x))));
veya başka bir yol var (yöntem referansı olarak da bilinir)
bu aslında kaputun altındaki yönteme erişiyor
Function<T,R> var_name = class_name :: method_name
misal : Function<Double,Double>Tanh = Math::tanh
Bir işlevi kullanma
Bir işlevi kullanmak için sadece apply(T t)işlev sınıfının yöntemini çağırmanız gerekir
misal : double num = sigmoid.apply(0)