Java. Основы FunctionalInterface

Начиная с Java 8 туда добавили FunctionalInterface.

Функциональный интерфейс, это интерфейс, который имеет только один абстрактный метод. Также данный интерфейс может иметь defauld и static методы.

Примеры - Runnable (метод run), Comparator(метод compare) и тд. 

Создадим свой интерфейс:


interface Console {
void print(String message);
}

Данный интерфейс является функциональным, тк имеет только один абстрактный

метод print. Хорошим тоном считается добавить аннотацию @FunctionalInterface

чтобы у компилятора была проверка на один абстрактный метод.

@FunctionalInterface
interface 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, на выход R
public 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 dollars

3.Consumer

на вход принимает T, ничего не возвращает
public interface Consumer<T> {
void accept(T t);
}
Consumer<Integer> printValue = dol->{
System.out.println("dol = " + dol + "$");
};
printValue.accept(5);

4.Supplier

Ничего не принимает, но возвращает объект типа T
public 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.711

5. 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); //6

6.BinaryOperator

Принимает два объекта типа Т и возвращает объект типа T
BinaryOperator<Integer> summ = (x,y)->x + y;
int s = summ.apply(4,5);
System.out.println(s); //9


Комментарии

Популярные сообщения из этого блога

Java. Лучшая практика работы с Enum

Java. Разбор класса Collections

Java. Удаление данных из коллекции