JavaRush /Java блогы /Random-KK /Функционалдық интерфейстерге кіріспе
minuteman
Деңгей

Функционалдық интерфейстерге кіріспе

Топта жарияланған
Өтінемін, көп тролль жасамаңыз, мен мақалаларды аударуды енді бастап жатырмын Функционалдық интерфейстерге кіріспе – 1

Функционалдық интерфейстерге кіріспе – Java 8-де қайта жасалған тұжырымдамалар

Әлемдегі әрбір Java әзірлеушісі кем дегенде бір рет келесі интерфейстердің бірін пайдаланды: java.lang.Runnable, java.awt.event.ActionListener, java.util.Comparator, java.util.concurrent.Callable. Олардың барлығына ортақ бір нәрсе бар, ол барлығында бір ғана әдіс бар. JDK-де көптеген басқа осындай интерфейстер бар, сонымен қатар Java әзірлеушілері жасаған басқалары. Single Abstract Method interfacesБұл интерфейстер (SAM интерфейстері) деп те аталады . Бұл интерфейстерді пайдаланудың ең танымал тәсілдерінің бірі келесі мысалдағыдай осы интерфейстерді пайдаланатын анонимді ішкі сыныптарды жасау болып табылады:
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-де SAM концепциясы қайта жасалады және функционалды интерфейстер деп аталады. Оларды лямбда өрнектері, әдіс сілтемелері және сілтеме конструкторлары арқылы көрсетуге болады. Жаңа @FunctionalInterface annotationсы жасалды, ол сіз түсіндірме берген интерфейс функционалдық деңгейде жұмыс істемеген кезде компилятор деңгейінде қателерді жіберу үшін пайдаланылады. Бір дерексіз әдіспен қарапайым функционалды интерфейсті қарастырайық:
@FunctionalInterface
public interface SimpleFunInterface {
    public void doWork();
}
Интерфейс класстан абстрактілі әдістерді де жариялай алады java.lang.Object, бірақ бұл жағдайда интерфейсті де функционалды деп жариялауға болады:
@FunctionalInterface
public interface SimpleFuncInterface {
    public void doWork();
    public String toString();
    public Boolean equals(Object o);
}
Интерфейске басқа дерексіз әдісті қосқаннан кейін IDE оны суреттегідей қате деп белгілейді: Функционалдық интерфейстерге кіріспе – 2 Интерфейс басқа интерфейстен мұра алады; егер интерфейс функционалды интерфейстен мұраланса және жаңа дерексіз әдістерді қамтымаса, онда бұл интерфейс де функционалды болып табылады. Бірақ интерфейс тек бір дерексіз әдісті және көптеген әдепкі әдістерді қамтуы мүмкін және ол әлі де функционалды болып саналады.
@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...");
    }
}
Ең жақсы мысал әлі де функционалды интерфейс болып табылады. Енді функционалды интерфейстерді жүзеге асыру үшін анонимді ішкі сыныпты ауыстыру үшін лямбда өрнектерін қалай пайдалануға болатынын қарастырайық:
/*
*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();
    }
}
Бағдарламаның нәтижесі келесідей болады:
Do work in SimpleFun impl...
Do work in lambda exp impl...
Егер сіз Java lambda өрнек синтаксисін қолдайтын IDE қолдансаңыз (Netbeans 8 Nightly құрастырулары) – Сіз анонимді ішкі сыныптарды пайдаланған кезде кеңес аласыз: Функционалдық интерфейстерге кіріспе – 3 Бұл Java 8-дегі функционалды интерфейстер тұжырымдамасына және оларды қалай жүзеге асыруға болатынына қысқаша кіріспе болды. лямбда өрнектерін қолдану.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION