JavaRush /Java блогу /Random-KY /Функционалдык интерфейстерге киришүү
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сы түзүлдү, ал сиз 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 Builds) – Сиз анонимдүү ички класстарды колдонууда ишарат аласыз: Функционалдык интерфейстерге киришүү - 3 Бул Java 8деги функционалдык интерфейстердин түшүнүгүнө жана аларды кантип ишке ашырууга кыскача киришүү болду ламбда туюнтмаларын колдонуу.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION