Java. Основы FunctionalInterface
Начиная с Java 8 туда добавили FunctionalInterface.
Функциональный интерфейс, это интерфейс, который имеет только один абстрактный метод. Также данный интерфейс может иметь defauld и static методы.
Примеры - Runnable (метод run), Comparator(метод compare) и тд.
Создадим свой интерфейс:
interface Console {
void print(String message);
}
Данный интерфейс является функциональным, тк имеет только один абстрактный
метод print. Хорошим тоном считается добавить аннотацию @FunctionalInterface
чтобы у компилятора была проверка на один абстрактный метод.
@FunctionalInterfaceinterface Console {
void print(String message);
}Раньше мы писали вот так:
Console con = new Console() {
@Override
public void print(String message) {
System.out.println(message);
}
};
con.print("Test");
Но это слишком много кода, благодаря функциональным интерфейсам можно сделать:
Console con = msg -> System.out.println(msg);
con.print("Test");
Разберем самые известные функциональные интерфейсы с Java8:
Predicate, Function, Consumer, Supplier, UnaryOperator, BinaryOperator
1. Predicate
На вход принимает Объект типа T, на выход boolean:
public interface Predicate<T> { boolean test(T t); }
Пример:
Predicate<Integer> isGreaterZero = x -> x > 0;
isGreaterZero.test(3) //true
Здесь лямбда, это x -> x > 0
Также конечно можно делать и так, те лямбда содержит более 1 строки:Пример:Predicate<Integer> isGreaterZero = x -> {
System.out.println("x = " + x);
return x > 0;
};2. Function
На вход принимает объект типа T, на выход Rpublic interface Function<T, R> {R apply(T t);}Пример:Function<Integer, String> convert = x -> {
if (x < 0) throw new IllegalArgumentException("Value " + x + " must be greater than or equal to zero");
if (x == 0) return "0 dollars";
if (x == 1) return "1 dollar";
return String.valueOf(x) + " dollars";
};
String s = convert.apply(15);
System.out.println(s);//15 dollars3.Consumer
на вход принимает T, ничего не возвращаетpublic interface Consumer<T> {void accept(T t);}Consumer<Integer> printValue = dol->{
System.out.println("dol = " + dol + "$");
};
printValue.accept(5);4.Supplier
Ничего не принимает, но возвращает объект типа Tpublic interface Supplier<T> {
T get();
}Пример:Supplier<Double> sup = () -> {
double d = Math.random();
System.out.println(d);//0.7106379643952604 return ((double) Math.round(d * 1_000) / 1_000);
};System.out.println(sup.get());//0.7115. UnaryOperator
Принимает T и возвращает Тpublic interface UnaryOperator<T> extends Function<T, T> {
}Пример:UnaryOperator<Integer> multiply2 = x->x*2;
int i = multiply2.apply(3);
System.out.println(i); //66.BinaryOperator
Принимает два объекта типа Т и возвращает объект типа TBinaryOperator<Integer> summ = (x,y)->x + y;
int s = summ.apply(4,5);
System.out.println(s); //9
Комментарии
Отправить комментарий