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

Научитесь создавать универсальные функциональные интерфейсы с ограничениями типов и без них в Java 8 и более поздних версиях. Обратите внимание, что функциональные интерфейсы допускают только один абстрактный метод. Эти интерфейсы также называются интерфейсами Single Abstract Method(SAM Interfaces).

1. Без ограничений по типу

1.1 Определение интерфейса

Можно определить функциональный интерфейс, который является общим для типа X и имеет функциональный метод, который принимает два аргумента типа X и возвращает значение типа X.

@FunctionalInterfacepublic interface ArgumentsProcessor<X>{X process(X arg1, X arg2);}

Этот интерфейс можно использовать для любого типа, например, ArgumentsProcessor<Integer>, ArgumentsProcessor<String> или ArgumentsProcessor<Employee>.

1.2 Пример

Пример Java для использования универсального функционального интерфейса с типом Integer.

ArgumentsProcessor<Integer> multiplyProcessor = new ArgumentsProcessor<Integer>() {@Overridepublic Integer process(Integer arg1, Integer arg2){return arg1 * arg2;}};System.out.println(multiplyProcessor.process(2,3)); //6

Пример Java для использования универсального функционального интерфейса с типом String.

ArgumentsProcessor<String> appendProcessor = new ArgumentsProcessor<String>() {@Overridepublic String process(String str1, String str2){return str1 + " " + str2;}};System.out.println(appendProcessor.process("Hello", "World !!")); //Hello World !!

2. С ограничениями по типу

2.1 Определение интерфейса

Можно определить функциональный интерфейс, ограниченный определенными типами, с помощью ключевого слова extends, например, X extends Number.

@FunctionalInterfacepublic interface ArgumentsProcesso<X extends Number>{X process(X arg1, X arg2);}

Этот интерфейс можно использовать для любого типа, то есть ArgumentsProcessor<Integer>, ArgumentsProcessor<Double>, но не для ArgumentsProcessor<String> или ArgumentsProcessor<Employee>.

В приведенном выше примере разрешенный тип должен расширять класс Number.

2.2 Пример

Пример Java для использования универсального функционального интерфейса с типом Integer.

ArgumentsProcessor<Double> doubleMultiplier = new ArgumentsProcessor<Double>() {@Overridepublic Double process(Double arg1, Double arg2){return arg1 * arg2;}};System.out.println(doubleMultiplier.process(4d, 6d)); //24.0

3. Специализированные функциональные интерфейсы

Специализация достигается путем расширения или реализации универсального функционального интерфейса одного типа. Полученный интерфейс или класс не является универсальным для этого типа.

@FunctionalInterfacepublic interface ArgumentsProcessor<Integer>{Integer process(Integer arg1, Integer arg2);}
ArgumentsProcessor<Integer> intMultiplier =(i1, i2) -> i1 * i2;System.out.println(intMultiplier.process(4, 5)); //20

Напишите мне ваши вопросы, связанные с функциональными интерфейсами с дженериками.

Исходный код на Github

Прокрутить вверх