Для поддержки лямбда-выражений в Java 8 они представили функциональные интерфейсы.
Интерфейс, имеющий Единый Абстрактный Метод, может называться Функциональным Интерфейсом.
Runnable, Comparator, Cloneable — вот некоторые примеры функционального интерфейса. Мы можем реализовать эти функциональные интерфейсы с помощью лямбда-выражения.
Например:
1
2
3
4
5
|
Thread t = new Thread( new Runnable(){ public void run(){ System.out.println( "Runnable implemented by using Lambda Expression" ); } }); |
Это старый способ создания темы.
Так как в Runnable есть единственный абстрактный метод, мы можем рассматривать его как функциональный интерфейс и использовать лямбда-выражения, как показано ниже.
1
2
3
|
Thread t = new Thread(()->{ System.out.println( "Runnable implemented by using Lambda Expression" ); }); |
Здесь вместо передачи объекта Runnable мы просто передали лямбда-выражение.
Объявление наших собственных функциональных интерфейсов:
Мы можем объявить наш собственный функциональный интерфейс, определив метод S ingle A bstract M в интерфейсе.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
public interface FunctionalInterfaceTest{ void display(); } //Test class to implement above interface public class FunctionInterfaceTestImpl { public static void main(String[] args){ //Old way using anonymous inner class FunctionalInterfaceTest fit = new FunctionalInterfaceTest(){ public void display(){ System.out.println( "Display from old way" ); }}; fit.display(); //outputs: Display from old way //Using lambda expression FunctionalInterfaceTest newWay = () -> {System.out.println( "Display from new Lambda Expression" );} newWay.display(); //outputs : Display from new Lambda Expression } } |
Мы можем аннотировать с помощью аннотации @FunctionalInterface , чтобы сообщать об ошибках времени компиляции. Это необязательно
Например:
1
2
3
4
5
|
@FunctionalInterface public interface FunctionalInterfaceTest{ void display(); void anotherDisplay(); //shows an error, FunctionalInterface should have only one abstarct method. } |
Метод по умолчанию:
Функциональный интерфейс не может иметь более одного абстрактного метода, но он может иметь более одного метода по умолчанию.
Методы по умолчанию введены в Java 8, чтобы добавить новые методы для взаимодействия без нарушения реализованных классов.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
interface DefaultInterfaceTest{ void show(); default void display(){ System.out.println( "Default method from interface can have body..!" ); } } public class DefaultInterfaceTestImpl implements DefaultInterfaceTest{ public void show(){ System.out.println( "show method" ); } //we dont need to provide any implementation to default method. public static void main(String[] args){ DefaultInterfaceTest obj = new DefaultInterfaceTestImpl(); obj.show(); //out puts: show method obj.display(); //outputs : Default method from interface can have body..! } } |
Основное использование метода по умолчанию — без форсирования реализованного класса, мы можем добавить метод в интерфейс.
Множественное наследование:
Если в двух интерфейсах используется один и тот же метод по умолчанию, и один класс реализует этот интерфейс, он выдаст ошибку.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
//Normal interface with show method interface Test{ default void show(){ System.out.println( "show from Test" ); } } //Another interface with same show method interface AnotherTest{ default void show(){ System.out.println( "show from Test" ); } } //Main class to implement above two interfaces class Main implements Test, AnotherTest{ //here is an ambiguity which show method has to inherit here } |
Этот класс не будет компилироваться, потому что между Test, интерфейсами AnotherTest и интерфейсом метода show () существует неоднозначность, для решения этой проблемы нам необходимо переопределить метод show () для Main Class.
1
2
3
4
5
6
7
|
class Main implements Test, AnotherTest{ void show(){ System.out.println( "Main show method" ); } } |
Ссылка: | Java 8: пример функционального интерфейса от нашего партнера по JCG Рамеша Кота из блога java2practice . |