Функциональные интерфейсы, часть 1.
Java 8 добавила много возможностей писать короткий и выразительный код. Одна из них — функциональный интерфейс (ФИ).
Интерфейс считается функциональным, если у него только один абстрактный метод. Это единственное требование, даже аннотация FunctionalInterface необязательна. Например, у интерфейса Comparable всего один метод, по определению он функциональный, но аннотации у него нет. Во всём остальном ФИ - это обычный интерфейс. У метода можно объявлять исключения и использовать любые типы параметров:
🔸Лямбда-выражение
🔸Ссылка на метод
🔸Ссылка на конструктор
Для большинства задач подойдут стандартные интерфейсы из пакета java.util.function. Всего их 43, но можно выделить 5 групп:
1️⃣ Consumer (потребитель)
Метод принимает один параметр и ничего не возвращает.
Ничего не принимает, но возвращает значение.
Принимает один параметр, возвращает одно значение:
Метод принимает один параметр и возвращает значение того же типа:
Принимает аргумент и возвращает boolean значение.
🔹BiConsumer, BiFunction, BiPredicate, BinaryOperator принимают два аргумента:
Интерфейс становится функциональным если в нём есть один абстрактный метод. Все остальные свойства у него такие же, как у обычного интерфейса. Аннотация FunctionalInterface не обязательна, но желательна для понимания кода.
Java 8 добавила много возможностей писать короткий и выразительный код. Одна из них — функциональный интерфейс (ФИ).
Интерфейс считается функциональным, если у него только один абстрактный метод. Это единственное требование, даже аннотация FunctionalInterface необязательна. Например, у интерфейса Comparable всего один метод, по определению он функциональный, но аннотации у него нет. Во всём остальном ФИ - это обычный интерфейс. У метода можно объявлять исключения и использовать любые типы параметров:
@FunctionalInterfaceЭкземплярами ФИ могут быть:
public interface Archiver{
void archive(String file)
throws FileNotFoundEx;
}
🔸Лямбда-выражение
🔸Ссылка на метод
🔸Ссылка на конструктор
Для большинства задач подойдут стандартные интерфейсы из пакета java.util.function. Всего их 43, но можно выделить 5 групп:
1️⃣ Consumer (потребитель)
Метод принимает один параметр и ничего не возвращает.
Consumer<String> c =2️⃣ Supplier (поставщик)
System.out::println;
Ничего не принимает, но возвращает значение.
Supplier<List> s =3️⃣ Function
ArrayList::new;
Принимает один параметр, возвращает одно значение:
Function<String,Long> map =4️⃣ UnaryOperator
s -> Long.valueOf(s);
Метод принимает один параметр и возвращает значение того же типа:
UnaryOperator<Integer> inc =5️⃣ Predicate
i -> i+1;
Принимает аргумент и возвращает boolean значение.
Predicate<String> filter =У этих ФИ есть удобные вариации:
s -> !s.isEmpty()
&& !s.contains("q");
🔹BiConsumer, BiFunction, BiPredicate, BinaryOperator принимают два аргумента:
BiConsumer<Integer,Integer> b =🔹LongFunction, LongSupplier , ToLongFunction и т.д позволяют не прописывать типы аргументов или выходных значений:
(x,y) -> println(x+y);
LongFunction<String> to =Ответ на вопрос перед постом:
Long::toString;
Интерфейс становится функциональным если в нём есть один абстрактный метод. Все остальные свойства у него такие же, как у обычного интерфейса. Аннотация FunctionalInterface не обязательна, но желательна для понимания кода.