JavaRush /Blog Java /Random-PL /Przerwa kawowa #182. Interfejsy funkcjonalne w Javie

Przerwa kawowa #182. Interfejsy funkcjonalne w Javie

Opublikowano w grupie Random-PL
Źródło: DZone Oto przegląd funkcjonalnych interfejsów w Javie: przeznaczenie, przykłady, wyrażenia lambda i lista predefiniowanych interfejsów. Przerwa kawowa #182.  Interfejsy funkcjonalne w Javie - 1Jako 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.
Interfejs Typ
Możliwość uruchomienia
BiConsumer(T, U) T, U →
BiFunkcja(T, U, R) T, U → R
Operator binarny T, T < → R
BiPredicate<T, U> T, U → wartość logiczna
Dostawca logiczny → wartość logiczna
Konsument T →
Operator DoubleBinary podwójne, podwójne → podwójne
Podwójny konsument podwójne →
Podwójna funkcja podwójne → R
Podwójny predykat podwójne → logiczne
Podwójny dostawca wartość logiczna →
Funkcja DoubleToInt podwójne → wew
Funkcja DoubleToLong podwójne → długie
DoubleUnaryOperator podwójne → podwójne
Funkcja<T, R> T → R
IntBinaryOperator int → int
Konsument wewnętrzny int →
Funkcja Int int → r
IntPredykat int → wartość logiczna
Dostawca wewnętrzny → wew
Funkcja IntToDouble int → podwójne
Funkcja IntToLong int → długi
IntUnaryOperator int → int
Długi operator binarny długi, długi → długi
Długi Konsument długi →
Długa funkcja długi → r
Długie orzeczenie długi →
Długi dostawca → długi
Funkcja LongToDouble długi → podwójny
Funkcja LongToInt długi → wew
Długi jednoargumentowy operator długi → długi
ObjDoubleConsumer T, podwójne →
ObjIntConsumer T, int →
ObjLongConsumer T, długi →
Orzec T → wartość logiczna
Dostawca → T
ToDoubleBiFunction<T, U> T, U → podwójne
Do funkcji Double T → podwójne
ToIntBiFunction<T, U> T, U → wew
Do funkcji Int T → wew
ToLongBiFunction<T, U> T, U → długie
Funkcja ToLong T → długi
Operator jednoargumentowy T → T

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.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION