Java 8 Funktionales Interface

Java 8 新特性Neue Funktionen in Java 8


Ein funktionales Interface (Functional Interface) ist ein Interface, das genau eine abstrakte Methode hat, aber mehrere nicht-abstrakte Methoden haben kann.

Funktionale Interfaces können implizit in Lambda-Ausdrücke umgewandelt werden.

Lambda-Ausdrücke und Methodenreferenzen (die eigentlich auch als Lambda-Ausdrücke betrachtet werden können).

Definieren Sie zum Beispiel ein funktionales Interface wie folgt:

@FunctionalInterface
interface GreetingService 
{
    void sayMessage(String message);
}

Dann können Sie einen Lambda-Ausdruck verwenden, um eine Implementierung der Schnittstelle darzustellen (Hinweis: Vor Java 8 wurde sie normalerweise mit anonymen Klassen implementiert):

GreetingService greetService1 = message -> System.out.println("Hello " + message);

Funktionale Schnittstellen können Lambda auf benutzerfreundliche Weise für vorhandene Funktionen unterstützen.

Funktionale Schnittstellen, die vor JDK 1.8 existierten:

  • java.lang.Runnable
  • java.util.concurrent.Callable
  • java.security.PrivilegedAction
  • java.util.Comparator
  • java.io.FileFilter
  • java.nio.file.PathMatcher
  • java.lang.reflect.InvocationHandler
  • java.beans.PropertyChangeListener
  • java.awt.event.ActionListener
  • javax.swing.event.ChangeListener

In JDK 1.8 neu hinzugefügte funktionale Schnittstellen:

  • java.util.function

java.util.function enthält viele Klassen zur Unterstützung der funktionalen Programmierung in Java. Zu den funktionalen Schnittstellen in diesem Paket gehören:

Nein. Schnittstelle & Beschreibung
1 BiConsumer<T,U>

Stellt eine Operation dar, die zwei Eingabeparameter akzeptiert und kein Ergebnis zurückgibt.

2 BiFunction<T,U,R>

Stellt eine Methode dar, die zwei Eingabeparameter akzeptiert und ein Ergebnis zurückgibt.

3 BinaryOperator<T>

Stellt eine Operation auf zwei Operanden desselben Typs dar und gibt ein Ergebnis desselben Typs wie die Operanden zurück.

4 BiPredicate<T,U>

Repräsentiert eine Methode mit booleschem Ergebnis und zwei Parametern.

5 BooleanSupplier

Repräsentiert einen Anbieter eines booleschen Ergebnisses.

6 Consumer<T>

Repräsentiert eine Operation, die eine Eingabe akzeptiert und kein Ergebnis zurückgibt.

7 DoubleBinaryOperator

Repräsentiert eine Operation auf zwei double-wertigen Operanden, die ein double-wertiges Ergebnis zurückgibt.

8 DoubleConsumer

Eine Operation, die einen double-wertigen Parameter akzeptiert und kein Ergebnis zurückgibt.

9 DoubleFunction<R>

Repräsentiert eine Methode, die einen double-wertigen Parameter akzeptiert und ein Ergebnis zurückgibt.

10 DoublePredicate

Stellt eine Methode mit booleschem Rückgabewert und einem Parameter vom Typ double dar.

11 DoubleSupplier

Stellt einen Anbieter eines double-Ergebnisses dar.

12 DoubleToIntFunction

Akzeptiert eine Eingabe vom Typ double und gibt ein Ergebnis vom Typ int zurück.

13 DoubleToLongFunction

Akzeptiert eine Eingabe vom Typ double und gibt ein Ergebnis vom Typ long zurück.

14 DoubleUnaryOperator

Akzeptiert einen Parameter vom Typ double, und der Rückgabewerttyp ist ebenfalls double.

15 Function<T,R>

Akzeptiert einen Eingabeparameter und gibt ein Ergebnis zurück.

16 IntBinaryOperator

Akzeptiert zwei Parameter, beide vom Typ int, und der Rückgabetyp ist ebenfalls int.

17 IntConsumer

Akzeptiert einen Eingabeparameter vom Typ int, kein Rückgabewert.

18 IntFunction<R>

Akzeptiert einen Eingabeparameter vom Typ int und gibt ein Ergebnis zurück.

19 IntPredicate

Akzeptiert einen Eingabeparameter vom Typ int und gibt ein Ergebnis vom Typ boolean zurück.

20 IntSupplier

Keine Parameter, gibt ein Ergebnis vom Typ int zurück.

21 IntToDoubleFunction

Akzeptiert eine Eingabe vom Typ int und gibt ein Ergebnis vom Typ double zurück.

22 IntToLongFunction

Akzeptiert eine Eingabe vom Typ int und gibt ein Ergebnis vom Typ long zurück.

23 IntUnaryOperator

Akzeptiert einen Parameter vom Typ int, und der Rückgabewerttyp ist ebenfalls int.

24 LongBinaryOperator

Akzeptiert zwei Parameter, beide vom Typ long, und der Rückgabewerttyp ist ebenfalls long.

25 LongConsumer

Akzeptiert einen Eingabeparameter vom Typ long, keinen Rückgabewert.

26 LongFunction<R>

Akzeptiert einen Eingabeparameter vom Typ long und gibt ein Ergebnis zurück.

27 LongPredicate

R akzeptiert einen long-Eingabeparameter und gibt ein Ergebnis vom Typ boolean zurück.

28 LongSupplier

Keine Parameter, gibt einen Wert vom Typ long zurück.

29 LongToDoubleFunction

Akzeptiert eine Eingabe vom Typ long und gibt ein Ergebnis vom Typ double zurück.

30 LongToIntFunction

Akzeptiert eine Eingabe vom Typ long und gibt ein Ergebnis vom Typ int zurück.

31 LongUnaryOperator

Akzeptiert einen Parameter vom Typ long, und der Rückgabewerttyp ist ebenfalls long.

32 ObjDoubleConsumer<T>

Akzeptiert einen Parameter vom Typ Object und einen Eingabeparameter vom Typ double, kein Rückgabewert.

33 ObjIntConsumer<T>

Akzeptiert einen Parameter vom Typ Object und einen Eingabeparameter vom Typ int, kein Rückgabewert.

34 ObjLongConsumer<T>

Akzeptiert einen Eingabeparameter vom Typ Object und einen vom Typ long, kein Rückgabewert.

35 Predicate<T>

Akzeptiert einen Eingabeparameter und gibt ein boolesches Ergebnis zurück.

36 Supplier<T>

Keine Parameter, gibt ein Ergebnis zurück.

37 ToDoubleBiFunction<T,U>

Akzeptiert zwei Eingabeparameter und gibt ein Ergebnis vom Typ double zurück.

38 ToDoubleFunction<T>

Akzeptiert einen Eingabeparameter und gibt ein Ergebnis vom Typ double zurück.

39 ToIntBiFunction<T,U>

Akzeptiert zwei Eingabeparameter und gibt ein Ergebnis vom Typ int zurück.

40 ToIntFunction<T>

Akzeptiert einen Eingabeparameter und gibt ein Ergebnis vom Typ int zurück

41 ToLongBiFunction<T,U>

Akzeptiert zwei Eingabeparameter und gibt ein Ergebnis vom Typ long zurück

42 ToLongFunction<T>

Akzeptiert einen Eingabeparameter und gibt ein Ergebnis vom Typ long zurück.

43 Unary<T>

Akzeptiert einen Parameter vom Typ T, und der Rückgabetyp ist ebenfalls.


Beispiel für ein funktionales Interface

Das Interface Predicate<T> ist ein funktionales Interface, das einen Eingabeparameter T akzeptiert und ein boolesches Ergebnis zurückgibt

Dieses Interface enthält verschiedene Default-Methoden, um Prädikate zu anderer komplexer Logik zu kombinieren (wie: AND, OR, NOT).

Dieses Interface wird verwendet, um zu testen, ob ein Objekt wahr oder falsch ist.

Wir können die Verwendung des funktionalen Interface Predicate<T> anhand des folgenden Beispiels kennenlernen (Java8Tester.java):

Java8Tester.java-Datei

import java.util.Arrays; import java.util.List; import java.util.function.Predicate; public class Java8Tester { public static void main(String args[]){ List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9); // Predicate<Integer> predicate = n -> true //n ist ein Parameter, der an die test-Methode der Predicate-Schnittstelle übergeben wird. //Wenn n existiert, gibt die test-Methode true zurück. System.out.println("Alle Daten ausgeben:"); //Parameter n übergeben eval(list, n->true); // Predicate<Integer> predicate1 = n -> n%2 == 0 //n ist ein Parameter, der an die test-Methode der Predicate-Schnittstelle übergeben wird. //Wenn n%2 gleich 0 ist, gibt die test-Methode true zurück. System.out.println("Alle geraden Zahlen ausgeben:"); eval(list, n-> n%2 == 0 ); // Predicate<Integer> predicate2 = n -> n > 3 //n ist ein Parameter, der an die test-Methode der Predicate-Schnittstelle übergeben wird. //Wenn n größer als 3 ist, gibt die test-Methode true zurück. System.out.println("Alle Zahlen größer als 3 ausgeben:"); eval(list, n-> n > 3 ); } public static void eval(List<Integer> list, Predicate<Integer> predicate) { for(Integer n: list) { if(predicate.test(n)) { System.out.println(n + " "); } } } }

Führen Sie das obige Skript aus, und das Ausgabeergebnis ist:

$ javac Java8Tester.java 
$ java Java8Tester
输出所有数据:
1 
2 
3 
4 
5 
6 
7 
8 
9 
输出所有偶数:
2 
4 
6 
8 
输出大于 3 的所有数字:
4 
5 
6 
7 
8 
9 

Java 8 新特性Neue Funktionen in Java 8

Weitere Erweiterungen