Javaдагы функционалдык интерфейс – бул болгону 1 абстракттуу методду камтыган интерфейс. Негизги максаты - аны ламбда туюнтмаларында жана метод шилтемелеринде колдонуу.
1 абстракттуу методдун болушу жалгыз шарт, ошондуктан функционалдык интерфейсте
Мен аларга майда-чүйдөсүнө чейин токтолбойм. Эң көп колдонулгандар: Consumer<T> , Function<T,R> , Predicate<T> , Supplier<T> , UnaryOperator<T> жана алардын Bi формалары. Кененирээк маалыматты documentация бетинен тапса болот: пакет java.util.function
default
методдор да камтылышы мүмкүн static
. Функционалдык интерфейске @FunctionalInterface annotationсын кошо аласыз. Бул талап кылынbyte, бирок бул annotation бар болсо, 1 абстракттуу ыкмадан көп же аз болсо, code түзүлбөйт. @FunctionalInterface кошуу сунушталат. Бул интерфейсти кимдир бирөө интерфейске жаңы абстракттуу ыкманы кошот жана ал иштебей калат деп кооптонбостон lambda туюнтмаларында колдонууга мүмкүндүк берет. Java ичинде орнотулган функционалдык интерфейстерге ээ 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 методы
}
Интервью учурунда этият болуңуз! Жолуңуз ачык болсун!
GO TO FULL VERSION