Źródło: DZone Oto przegląd funkcjonalnych interfejsów w Javie: przeznaczenie, przykłady, wyrażenia lambda i lista predefiniowanych interfejsów. Jako obiektowy język programowania Java nie mogła wcześniej mieć niezależnych funkcji, ponieważ wszystko z wyjątkiem niektórych prymitywnych typów danych i metod w tym języku kręci się wokół klas i obiektów. Jednak w Javie 8 wprowadzono nową koncepcję zwaną interfejsem funkcjonalnym, a także kilka innych funkcji, takich jak wyrażenia Lambda, Time API, Stream API i tak dalej. Czym są te interfejsy funkcjonalne i jak je zdefiniować? Dowiedzmy Się!
Co to jest interfejs?
Interfejs to zbiór reguł określających interakcję elementów systemu. Jest również znany jako zarys klasy zawierającej metody abstrakcyjne i stałe statyczne. Interfejs może zawierać jedną lub więcej metod abstrakcyjnych. Interfejsy pozwalają także ustawić wymagania dla klas, czyli jakie metody są wymagane od klasy. Mówiąc najprościej, interfejs jest jak kontrakt, którego musi przestrzegać każda klasa wdrażająca. Oto przykład:Interface A1
{
void method1();
String method2(String X);
}
Class A1 implements A
{
@Override
public void method1(){}
@Override
public String method2(String X) { return x; }
}
Jeśli klasa implementująca interfejs nie zadeklaruje wszystkich metod interfejsu, kod nie zostanie uruchomiony i wygeneruje błąd: „ błąd: A1 nie jest abstrakcyjny i nie przesłania abstrakcyjnej metody w A1. " (błąd: A1 nie jest abstrakcyjny i nie zastępuje metody abstrakcyjnej w A1). Przed JDK 8 interfejsy nie mogły definiować implementacji, ale teraz można dodać domyślne implementacje dla metod interfejsu. Możemy także definiować metody statyczne i domyślne, które można wywołać bez obiektu w interfejsie Interfejsy są używane głównie w celu uzyskania wielokrotnego dziedziczenia i luźnego łączenia w kodzie. Teraz, gdy mamy już pełną wiedzę na temat interfejsów, zobaczmy, czym jest interfejs funkcjonalny i jak działa.
Co to jest interfejs funkcjonalny?
Interfejs funkcjonalny jest również znany jako interfejs pojedynczej metody abstrakcyjnej (SAM). Jak sama nazwa wskazuje, może mieć co najwyżej jedną metodę abstrakcyjną. Interfejs funkcjonalny może posiadać kilka metod statycznych i domyślnych wraz z implementacją, a także dodatkową metodę abstrakcyjną. Aby oznaczyć interfejs jako funkcjonalny, używana jest adnotacja @FunctionalInterface . Jest to konieczne, aby uniknąć błędnego deklarowania dodatkowych metod. Tym, co sprawia, że interfejs funkcjonalny jest tak popularny, jest możliwość wykorzystania wyrażeń lambda do tworzenia interfejsów bez konieczności stosowania anonimowych i uciążliwych implementacji klas. Użycie słowa kluczowego streszczenie w interfejsach funkcjonalnych jest opcjonalne, ponieważ metody zdefiniowane w interfejsie są domyślnie abstrakcyjne.Co to są wyrażenia lambda?
Wyrażenie lambda to nienazwana lub anonimowa metoda, która nie jest wykonywana samodzielnie, ale służy do implementacji określonych metod interfejsu funkcjonalnego. Definiuje się to następująco:(parameter list) -> lambda body
Operator strzałki ( -> ), który widzisz w kodzie, jest znany jako operator lambda. Na przykład, jeśli mamy następującą metodę:
double getGoldenRatioValue() {
return 1.61803;
}
Używając wyrażenia lambda, możemy zapisać to w następujący sposób:
() -> 1.61803
Jak widać metoda w funkcji lambda nie ma parametrów, więc lewa strona instrukcji jest pusta. Ponieważ prawa strona określa akcję, w tym przykładzie zwróci wartość złotego podziału: 1,61803. Przed Javą 8 kluczową rolę odgrywało wdrażanie interfejsów lub tworzenie obiektów klas wewnętrznych, ale w Javie 8 jedyne, co musimy teraz zrobić, to przypisać wyrażenia lambda do interfejsów funkcjonalnych.
Przykłady interfejsów funkcjonalnych
Aby utworzyć interfejsy funkcjonalne, możesz użyć adnotacji @FunctionalInterface lub skorzystać z predefiniowanych interfejsów funkcjonalnych Java.Przykład 1
- Najpierw oznaczymy tagiem @FunctionalInterface i utworzymy interfejs o nazwie MyInterface , który będzie wywoływany przez abstrakcyjną metodę getGoldenRationValue() .
- Następnie utworzymy główną klasę publiczną , aby wykonać metodę.
- Aby użyć wyrażenia lambda w interfejsie funkcjonalnym, zadeklarujemy odwołanie do MyInterfaceDemo , a następnie przypiszemy wyrażenie lambda do tego odniesienia.
- Na koniec wydrukujemy wartość złotego podziału za pomocą interfejsu referencyjnego.
import java.lang.FunctionalInterface;
// kreacja и маркировка функционального интерфейса
@FunctionalInterface
interface MyInterface {
// Это абстрактный метод
double getGoldenRatioValue();
}
public class Main {
public static void main( String[] args ) {
//декларируем ссылку на функциональный интерфейс
MyInterface ref;
//используем Lambda Expression
ref = () -> 1.61803;
System.out.println("Value of Golden Ratio = " + ref.getGoldenRatioValue());
}
}
Wniosek:
Wartość złotego podziału = 1,61803
Przykład 2
- W tym przykładzie użyjemy predefiniowanego interfejsu funkcji ToDoubleFunction , który pobiera argument T i zwraca wartość double jako wynik.
- ToDoubleFuntion zawiera abstrakcyjną metodę o nazwie ApplyasDouble() .
- Na koniec drukujemy całą długość wiadomości, łącznie ze spacjami.
import java.util.function.ToDoubleFunction;
public class MyInterface2 {
public static void main(String[] args) {
ToDoubleFunction<String> length = x -> x.length();
System.out.println(length.applyAsDouble("This is an example of predefined functional interface."));
}
}
Wniosek:
54,0
Lista preinstalowanych interfejsów funkcjonalnych
Teraz, gdy wiemy, jak zdefiniować interfejsy funkcjonalne, zobaczmy, ile jest predefiniowanych (wbudowanych) interfejsów funkcjonalnych. Istnieją 4 główne typy interfejsów funkcjonalnych, które można zaimplementować w różnych sytuacjach: Konsument , Predykat , Funkcja i Dostawca . Spośród tych czterech interfejsów Consumer , Function i Predicate mają dodatkowe interfejsy funkcyjne. Oto lista wszystkich wbudowanych lub predefiniowanych interfejsów w Javie. Notatka. T, U i R wymienione w poniższej tabeli reprezentują odpowiednio typ pierwszego argumentu (T), drugiego argumentu (U) i wyniku (R) operacji.Podsumujmy to
Kilka kluczowych wniosków z tego posta, które warto zapamiętać:- Interfejs działa jako mechanizm abstrakcji.
- Interfejs funkcjonalny może posiadać kilka metod statycznych i domyślnych wraz z implementacją, a także dodatkową metodę abstrakcyjną.
- Metody zdefiniowane w interfejsie funkcjonalnym są domyślnie abstrakcyjne, więc używanie słowa kluczowego streszczenie nie jest już konieczne.
- Wyrażenie lambda to anonimowa metoda, która nie jest wykonywana samodzielnie, ale służy do implementacji określonych metod interfejsu funkcjonalnego.
- Aby utworzyć interfejsy funkcjonalne, możesz użyć adnotacji @FunctionalInterface lub skorzystać z predefiniowanych interfejsów funkcjonalnych Java.
GO TO FULL VERSION