Для поддержки лямбда-выражений в 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 interfacepublic 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
|
@FunctionalInterfacepublic 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 methodinterface Test{ default void show(){ System.out.println("show from Test"); }}//Another interface with same show methodinterface AnotherTest{ default void show(){ System.out.println("show from Test"); }}//Main class to implement above two interfacesclass 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 . |