Çox troll etməyin, mən məqalələri tərcümə etməyə təzəcə başlayıram
İnterfeys başqa interfeysdən miras qala bilər, əgər interfeys funksional interfeysdən miras qalırsa və yeni abstrakt metodlar yoxdursa, bu interfeys də funksionaldır. Lakin interfeys yalnız bir mücərrəd metod və bir çox standart metodlardan ibarət ola bilər və o, hələ də funksional hesab olunacaq.
Funksional interfeyslərə giriş - Java 8-də yenidən yaradılmış konsepsiyalar
Dünyadakı hər bir Java tərtibatçısı ən azı bir dəfə aşağıdakı interfeyslərdən birini istifadə etmişdir:java.lang.Runnable
, java.awt.event.ActionListener
, java.util.Comparator
, java.util.concurrent.Callable
. Onların hamısının ortaq bir cəhəti var, o da hamısının yalnız bir metodu olmasıdır. JDK-da bir çox başqa belə interfeyslər, eləcə də Java tərtibatçıları tərəfindən yaradılmış digər interfeyslər var. Single Abstract Method interfaces
Bu interfeyslər (SAM interfeysləri) kimi də tanınır . Bu interfeyslərdən istifadə etməyin ən məşhur yollarından biri aşağıdakı nümunədə olduğu kimi bu interfeyslərdən istifadə edən anonim daxili siniflər yaratmaqdır:
public class AnonymousInnerClassTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("A thread created and running...");
}
}).start();
}
}
Java 8-də SAM konsepsiyası yenidən yaradılır və funksional interfeyslər adlanır. Onlar lambda ifadələri, metod istinadları və istinad konstruktorları ilə təmsil oluna bilər. Yeni @FunctionalInterface annotasiyası yaradılmışdır ki, qeyd etdiyiniz interfeys funksional səviyyədə işləmədikdə kompilyator səviyyəsində səhvlər atmaq üçün istifadə olunur. Bir abstrakt metodla sadə funksional interfeysə baxaq:
@FunctionalInterface
public interface SimpleFunInterface {
public void doWork();
}
İnterfeys həm də sinifdən abstrakt metodlar elan edə bilər java.lang.Object
, lakin bu halda interfeys funksional elan edilə bilər:
@FunctionalInterface
public interface SimpleFuncInterface {
public void doWork();
public String toString();
public Boolean equals(Object o);
}
Siz interfeysə başqa mücərrəd metod əlavə etdikdən sonra IDE onu şəkildəki kimi səhv kimi qeyd edəcək:
Başqa nə oxumaq lazımdır: |
---|
@FunctionalInterface
public interface ComplexFunctionalInterface extends SimpleFuncInterface {
default public void doSomeWork() {
System.out.println("Doing some work in interface impl...");
}
default public void doSomeWork() {
System.out.println("Doing some other work in interface impl...");
}
}
Ən yaxşı nümunə hələ də funksional interfeysdir. İndi funksional interfeysləri həyata keçirmək üçün anonim daxili sinifi əvəz etmək üçün lambda ifadələrindən necə istifadə edə biləcəyimizə baxaq:
/*
*Implementation the interface by creating an
*anonymoous inner class versus using
*lambda expression.
*/
public class SimpleFunInterfaceTest {
public static void main(String[] args) {
carryOutWork(new SimpleFunInterface() {
@Override
public void doWork() {
System.out.println("Do work in SimpleFun impl...");
}
});
carryOutWork(() -> System.out.println("Do work in lambda exp impl..."));
}
public static void carryOutWork(SimpleFuncInterface sfi) {
sfi.work();
}
}
Proqramın nəticəsi aşağıdakı kimi olacaq:
Do work in SimpleFun impl...
Do work in lambda exp impl...
Əgər siz Java lambda ifadə sintaksisini dəstəkləyən IDE istifadə edirsinizsə (Netbeans 8 Nightly builds) – Anonim daxili siniflərdən istifadə edərkən ipucu alırsınız: Bu, Java 8-də funksional interfeyslər konsepsiyasına və onların necə həyata keçirilə biləcəyinə qısa bir giriş idi. lambda ifadələrindən istifadə etməklə.
GO TO FULL VERSION