JavaRush /Блоги Java /Random-TG /Муқаддима ба интерфейсҳои функсионалӣ
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) маълуманд . Яке аз роҳҳои маъмултарини истифодаи ин интерфейсҳо эҷоди синфҳои дохorи беном, ки ин интерфейсҳоро истифода мебаранд, ба мисли мисоли зерин мебошад:
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 сохта шудааст, ки барои партофтани хатогиҳо дар сатҳи компилятор истифода мешавад, вақте интерфейсе, ки шумо шарҳ додед, дар сатҳи функсионалӣ кор намекунад. Биёед интерфейси функсионалии оддиро бо як усули абстрактӣ бубинем:
@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...");
    }
}
Намунаи олӣ ҳоло ҳам интерфейси функсионалӣ мебошад. Акнун биёед бубинем, ки чӣ тавр мо метавонем ифодаҳои ламбдаро барои иваз кардани синфи дохorи беном барои татбиқи интерфейсҳои функсионалӣ истифода барем:
/*
*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...
Агар шумо IDE-ро истифода баред, ки синтаксиси ифодаи Java lambda-ро дастгирӣ мекунад (Netbeans 8 Nightly Builds) - Шумо ҳангоми истифодаи синфҳои дохorи беном маслиҳат мегиред: Муқаддима ба интерфейсҳои функсионалӣ - 3 Ин як муқаддимаи мухтасар ба консепсияи интерфейсҳои функсионалӣ дар Java 8 буд ва чӣ гуна онҳоро татбиқ кардан мумкин аст. бо истифода аз ифодаҳои лямбда.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION