JavaRush /Java блогу /Random-KY /Java функционалдык интерфейстери
Алексей
Деңгээл

Java функционалдык интерфейстери

Группада жарыяланган
Javaдагы функционалдык интерфейс – бул болгону 1 абстракттуу методду камтыган интерфейс. Негизги максаты - аны ламбда туюнтмаларында жана метод шилтемелеринде колдонуу.
Java функционалдык интерфейстери - 1
1 абстракттуу методдун болушу жалгыз шарт, ошондуктан функционалдык интерфейсте defaultметоддор да камтылышы мүмкүн static. Функционалдык интерфейске @FunctionalInterface annotationсын кошо аласыз. Бул талап кылынbyte, бирок бул annotation бар болсо, 1 абстракттуу ыкмадан көп же аз болсо, code түзүлбөйт. @FunctionalInterface кошуу сунушталат. Бул интерфейсти кимдир бирөө интерфейске жаңы абстракттуу ыкманы кошот жана ал иштебей калат деп кооптонбостон lambda туюнтмаларында колдонууга мүмкүндүк берет. Java ичинде орнотулган функционалдык интерфейстерге ээ java.util.function. Мен аларга майда-чүйдөсүнө чейин токтолбойм. Эң көп колдонулгандар: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> жана алардын Bi формалары. Кененирээк маалыматты documentация бетинен тапса болот: пакет java.util.function
import java.util.function.Predicate;

//Определяем свой функциональный интерфейс
@FunctionalInterface
interface MyPredicate {
    boolean test(Integer value);
}

public class Tester {
    public static void main(String[] args) throws Exception {
        MyPredicate myPredicate = x -> x > 0;
        System.out.println(myPredicate.test(10));   //true

        //Аналогично, но используется встроенный функциональный интерфейс java.util.function.Predicate
        Predicate<Integer> predicate = x -> x > 0;
        System.out.println(predicate.test(-10));    //false
    }
}
Бирок Java тorнин спецификациясында сүрөттөлгөн бир тымызын жагдай бар экен: "интерфейстер Объекттен мураска алbyte, тескерисинче, Объект сыяктуу көптөгөн ыкмаларды кыйыр түрдө жарыялайт." Бул функциялык интерфейстер класста аныкталган абстракттуу методдорду кошумча камтышы мүмкүн дегенди билдирет Object. Төмөнкү code жарактуу, компиляция же аткаруу катасы болбойт:
@FunctionalInterface
public interface Comparator<T> {
   int compare(T o1, T o2);
   boolean equals(Object obj);
   // другие default or static методы
}
Интервью учурунда этият болуңуз! Жолуңуз ачык болсун!
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION