Статьи

Java 8: пример функционального интерфейса

Для поддержки лямбда-выражений в 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 .