Interfejs zawierający dokładnie jedną metodę abstrakcyjną nazywany jest interfejsem funkcjonalnym. Może mieć dowolną liczbę domyślnych metod statycznych, ale może zawierać tylko jedną metodę abstrakcyjną. Może także deklarować metody klasy obiektu.
Interfejs funkcjonalny jest również znany jako interfejsy pojedynczej metody abstrakcyjnej lub interfejsy SAM. Jest to nowa funkcja w Javie, która pomaga w osiągnięciu funkcjonalnego podejścia do programowania.
Przykład 1
@FunctionalInterface interface sayable{ void say(String msg); } public class FunctionalInterfaceExample implements sayable{ public void say(String msg){ System.out.println(msg); } public static void main(String[] args) { FunctionalInterfaceExample fie = new FunctionalInterfaceExample(); fie.say('Hello there'); } }Przetestuj teraz
Wyjście:
Hello there
Interfejs funkcjonalny może posiadać metody klasy obiektowej. Zobacz w poniższym przykładzie.
Przykład 2
@FunctionalInterface interface sayable{ void say(String msg); // abstract method // It can contain any number of Object class methods. int hashCode(); String toString(); boolean equals(Object obj); } public class FunctionalInterfaceExample2 implements sayable{ public void say(String msg){ System.out.println(msg); } public static void main(String[] args) { FunctionalInterfaceExample2 fie = new FunctionalInterfaceExample2(); fie.say('Hello there'); } }Przetestuj teraz
Wyjście:
Hello there
Nieprawidłowy interfejs funkcjonalny
Interfejs funkcjonalny może rozszerzać inny interfejs tylko wtedy, gdy nie posiada żadnej abstrakcyjnej metody.
interface sayable{ void say(String msg); // abstract method } @FunctionalInterface interface Doable extends sayable{ // Invalid '@FunctionalInterface' annotation; Doable is not a functional interface void doIt(); }
Wyjście:
compile-time error
Przykład 3
W poniższym przykładzie interfejs funkcjonalny rozszerza się na interfejs niefunkcjonalny.
interface Doable{ default void doIt(){ System.out.println('Do it now'); } } @FunctionalInterface interface Sayable extends Doable{ void say(String msg); // abstract method } public class FunctionalInterfaceExample3 implements Sayable{ public void say(String msg){ System.out.println(msg); } public static void main(String[] args) { FunctionalInterfaceExample3 fie = new FunctionalInterfaceExample3(); fie.say('Hello there'); fie.doIt(); } }Przetestuj teraz
Wyjście:
przykład nazwy użytkownika
Hello there Do it now
Predefiniowane interfejsy funkcjonalne Java
Java udostępnia predefiniowane interfejsy funkcjonalne umożliwiające programowanie funkcjonalne za pomocą lambda i odwołań do metod.
Można także zdefiniować własny, niestandardowy interfejs funkcjonalny. Poniżej znajduje się lista interfejsów funkcjonalnych, które znajdują się w pakiecie java.util.function.
Interfejs | Opis |
---|---|
BiKonsument | Reprezentuje operację, która akceptuje dwa argumenty wejściowe i nie zwraca żadnego wyniku. |
Konsument | Reprezentuje operację, która akceptuje pojedynczy argument i nie zwraca żadnego wyniku. |
Funkcjonować | Reprezentuje funkcję, która przyjmuje jeden argument i zwraca wynik. |
Orzec | Reprezentuje predykat (funkcję o wartościach logicznych) jednego argumentu. |
BiFunkcja | Reprezentuje funkcję, która przyjmuje dwa argumenty i zwraca wynik. |
Operator binarny | Reprezentuje operację na dwóch operandach tego samego typu danych. Zwraca wynik tego samego typu co operandy. |
BiPredykat | Reprezentuje predykat (funkcję o wartościach logicznych) dwóch argumentów. |
Dostawca logiczny | Reprezentuje dostawcę wyników o wartościach logicznych. |
Operator DoubleBinary | Reprezentuje operację na dwóch operandach typu podwójnego i zwraca wartość typu podwójnego. |
Podwójny konsument | Reprezentuje operację, która akceptuje pojedynczy argument typu double i nie zwraca żadnego wyniku. |
Podwójna funkcja | Reprezentuje funkcję, która akceptuje argument typu double i generuje wynik. |
Podwójny predykat | Reprezentuje predykat (funkcję o wartości logicznej) jednego argumentu typu podwójnego. |
Podwójny dostawca | Reprezentuje dostawcę wyników podwójnego typu. |
Funkcja DoubleToInt | Reprezentuje funkcję, która akceptuje argument typu double i generuje wynik typu int. |
Funkcja DoubleToLong | Reprezentuje funkcję, która akceptuje argument typu podwójnego i generuje wynik typu długiego. |
DoubleUnaryOperator | Reprezentuje operację na pojedynczym operandzie typu podwójnego, która daje wynik typu podwójnego. |
IntBinaryOperator | Reprezentuje operację na dwóch operandach typu int i zwraca wynik typu int. |
Konsument wewnętrzny | Reprezentuje operację, która akceptuje pojedynczy argument w postaci liczby całkowitej i nie zwraca żadnego wyniku. |
Funkcja Int | Reprezentuje funkcję, która przyjmuje argument w postaci liczby całkowitej i zwraca wynik. |
IntPredykat | Reprezentuje predykat (funkcję o wartości logicznej) jednego argumentu będącego liczbą całkowitą. |
Dostawca wewnętrzny | Reprezentuje dostawcę typu całkowitego. |
Funkcja IntToDouble | Reprezentuje funkcję, która przyjmuje argument w postaci liczby całkowitej i zwraca wartość double. |
Funkcja IntToLong | Reprezentuje funkcję, która przyjmuje argument w postaci liczby całkowitej i zwraca wartość typu long. |
IntUnaryOperator | Reprezentuje operację na pojedynczym operandze całkowitym, która daje wynik w postaci liczby całkowitej. |
Długi operator binarny | Reprezentuje operację na dwóch operandach typu długiego i zwraca wynik typu długiego. |
Długi Konsument | Reprezentuje operację, która akceptuje pojedynczy argument typu długiego i nie zwraca żadnego wyniku. |
Długa funkcja | Reprezentuje funkcję, która akceptuje argument typu długiego i zwraca wynik. |
Długie orzeczenie | Reprezentuje predykat (funkcję o wartości logicznej) jednego argumentu typu długiego. |
Długi dostawca | Reprezentuje dostawcę wyników typu długiego. |
Funkcja LongToDouble | Reprezentuje funkcję, która akceptuje argument typu długiego i zwraca wynik typu podwójnego. |
Funkcja LongToInt | Reprezentuje funkcję, która akceptuje argument typu długiego i zwraca wynik w postaci liczby całkowitej. |
Długi jednoargumentowy operator | Reprezentuje operację na pojedynczym operandzie typu długiego, która zwraca wynik typu długiego. |
ObjDoubleConsumer | Reprezentuje operację, która akceptuje obiekt i podwójny argument i nie zwraca żadnego wyniku. |
ObjIntConsumer | Reprezentuje operację, która akceptuje obiekt i argument w postaci liczby całkowitej. Nie zwraca wyniku. |
ObjLongConsumer | Reprezentuje operację, która akceptuje obiekt i długi argument, nie zwraca żadnego wyniku. |
Dostawca | Reprezentuje dostawcę wyników. |
Funkcja DoubleBi | Reprezentuje funkcję, która przyjmuje dwa argumenty i generuje wynik typu double. |
Do funkcji Double | Reprezentuje funkcję zwracającą wynik typu double. |
DoIntBiFunction | Reprezentuje funkcję, która przyjmuje dwa argumenty i zwraca liczbę całkowitą. |
Do funkcji Int | Reprezentuje funkcję zwracającą liczbę całkowitą. |
Funkcja ToLongBi | Reprezentuje funkcję, która przyjmuje dwa argumenty i zwraca wynik typu długiego. |
Funkcja ToLong | Reprezentuje funkcję zwracającą wynik typu długiego. |
Operator jednoargumentowy | Reprezentuje operację na pojedynczym operandze, która zwraca wynik tego samego typu, co jego operand. |