Java 8'de, yöntemler Lambda ifadeleri olarak oluşturulabilir ve referansla aktarılabilir (kaputun altında küçük bir çalışma ile). İnternette lambdaların oluşturulduğu ve metotlarla kullanıldığı pek çok örnek var, ancak parametre olarak bir lambda alan bir metodun nasıl yapılacağına dair hiçbir örnek yok. Bunun sözdizimi nedir?
MyClass.method((a, b) -> a+b);
class MyClass{
//How do I define this method?
static int method(Lambda l){
return l(5, 10);
}
}
Lambda'lar tamamen bir çağrı yeri yapısıdır: Lambda'nın alıcısının bir Lambda'nın söz konusu olduğunu bilmesi gerekmez, bunun yerine uygun yönteme sahip bir Arayüz kabul eder.
Başka bir deyişle, tam olarak istediğiniz şeyi kabul eden ve döndüren işlevsel bir arayüz (yani tek bir yöntemi olan bir arayüz) tanımlar veya kullanırsınız.
Bunun için Java 8, java.util.function
içinde yaygın olarak kullanılan bir dizi arayüz türüyle birlikte gelir (JavaDoc hakkındaki ipucu için Maurice Naftalin'e teşekkürler).
Bu özel kullanım durumu için java.util.function.IntBinaryOperator ile tek bir int applyAsInt(int left, int right)
yöntemi vardır, bu nedenle `metodunuzu' şu şekilde yazabilirsiniz:
static int method(IntBinaryOperator op){
return op.applyAsInt(5, 10);
}
Ancak siz de kendi arayüzünüzü tanımlayabilir ve bu şekilde kullanabilirsiniz:
public interface TwoArgIntOperator {
public int op(int a, int b);
}
//elsewhere:
static int method(TwoArgIntOperator operator) {
return operator.op(5, 10);
}
Kendi arayüzünüzü kullanmanın avantajı, amacı daha açık bir şekilde gösteren isimlere sahip olabilmenizdir.
Lambda ifadesini kullanmak için ya kendi işlevsel arayüzünüzü oluşturmanız ya da değer olarak iki tamsayı ve dönüş gerektiren işlemler için Java işlevsel arayüzünü kullanmanız gerekir. IntBinaryOperator
Kullanıcı tanımlı işlevsel arayüz kullanarak
interface TwoArgInterface {
public int operation(int a, int b);
}
public class MyClass {
public static void main(String javalatte[]) {
// this is lambda expression
TwoArgInterface plusOperation = (a, b) -> a + b;
System.out.println("Sum of 10,34 : " + plusOperation.operation(10, 34));
}
}
Java işlevsel arayüzünü kullanma
import java.util.function.IntBinaryOperator;
public class MyClass1 {
static void main(String javalatte[]) {
// this is lambda expression
IntBinaryOperator plusOperation = (a, b) -> a + b;
System.out.println("Sum of 10,34 : " + plusOperation.applyAsInt(10, 34));
}
}
Oluşturduğum diğer örnek burada
http://lambdafaq.org/lambda-resources adresinden bağlantı verilen Lambda özellikli Java 8 JavaDocs'un Web üzerinden erişilebilen genel bir sürümü bulunmaktadır. (Bunun Joachim Sauer'in cevabına bir yorum olması gerekirdi, ancak yorum eklemek için ihtiyacım olan itibar puanlarıyla SO hesabıma giremiyorum). Lambdafaq sitesi (ben yönetiyorum) bu ve diğer pek çok Java-lambda sorusunu yanıtlıyor.
NB Bu yanıt Java 8 GA belgeleri kamuya açık hale gelmeden önce yazılmıştır. Yine de Lambda SSS Java 8'de sunulan özellikler hakkında bilgi edinen kişiler için hala yararlı olabileceği için yerinde bıraktım.