codestory

Die Anleitung zu Java Functional Interface

  1. Functional Interface
  2. Examples
  3. die üblichen Functional Interface

1. Functional Interface

Functional Interface ist ein neuer Begriff, der in Java ab die Version 8 eingeführt. Es ist eine Interface mit einer einzigen abstraktiven Methode. Die Ausdrücke Lambda wird benutzt um ein Objekt von einem Functional Interface schnell zu erstellen.
Unter ist das eine Functional Interface, mit einer einzigen abstraktiven Methode:
package org.o7planning.ex;

public interface Greeting {

  String greeting(String name);
 
  default String hello(String name) {
      return "Hello " + name;
  }
}
Wenn eine Interface zum Zweck als functional interface entworfen ist, sollen Sie die Annotation @FunctionalInterface zur Anotation benutzen. Obwohl es nicht obligatorisch ist, hilft es den Leuten beim einfachen Verstanden Ihrer Design-Idee und gleichzeitig unterstützt es den Kompiler bei der Benachrichtigung Ihrer Fehler während der Applikationentwicklung. Z.B der Kompiler wird Ihnen den Fehler informieren wenn eine mit @FunctionalInterface anotierte Methode mehr als eine abstraktive Methode hat.
package org.o7planning.ex;

@FunctionalInterface
public interface Greeting {

  String greeting(String name);
 
  default String hello(String name) {
      return "Hello " + name;
  }
}
Machen wir weiter mit dem obengemeinten Beispiel. Vor Java 8 müssen Sie bei der Erstellung eines Objekt Greeting eine Klasse erstellen, danach implementiere die abstraktive Methode von Greeting. Das ist ziemlich lang.
UsingGreetingBeforeJ8.java
package org.o7planning.ex;

public class UsingGreetingBeforeJ8 {

    public static void main(String[] args) {
        
        // Create Greeting object:
        Greeting obj = new Greeting() {
            @Override
            public String greeting(String name) {
                return "Hi " + name;
            }
        };
        
        System.out.println(obj.greeting("Tran"));
        System.out.println(obj.hello("Tran"));
    }
}
Im Grunde fasst Functional Interface ein eine einzige abstraktive Methode um, Daher brauchen Sie lediglich diese Methode implementieren. Die Ausdruck Lambda von Java 8 hilft Ihnen bei dem verkürzten Schreiben des oben Beispiel.
UsingGreetingJ8A.java
package org.o7planning.ex;

public class UsingGreetingJ8A {

    public static void main(String[] args) {
        
        // Create Greeting object with Lambda expression:
        Greeting obj = (String name) -> {
            return "Hi " + name;
        };
        
        System.out.println(obj.greeting("Tran"));
        System.out.println(obj.hello("Tran"));
    }
}
Die Datentypen von der Parameter in die abstraktive Methode von Greeting sind bekannt. Deshalb ist es unnotwendig, sie wieder zu schreiben. Wir können das obengemeinte Beispiel verkürzen:
Greeting obj = (name) -> {
    return "Hi " + name;
};
Wenn die abstraktive Methode den einzigen Parameter hat, können Sie parentheses ( ) im Ausdruck Lambda nicht schreiben:
Greeting obj = name -> {
    return "Hi " + name;
};
Wenn die Inhalt der Methode nur aus einem Ausdruck besteht, benötigen Sie möglichweise keine Klammern (braces) { } und müssen auch nicht das Schlüsselwort "return" schreiben.
Greeting obj = name ->  "Hi " + name;
Zum letzten wird die Kode des Beispiel sehr viel kürzer:
UsingGreetingJ8.java
package org.o7planning.ex;

public class UsingGreetingJ8 {

    public static void main(String[] args) {

        // Create Greeting object with Lambda expression:
        Greeting obj = name ->  "Hi " + name;

        System.out.println(obj.greeting("Tran"));
        System.out.println(obj.hello("Tran"));
    }
}
Output:
Hi Tran
Hello Tran

2. Examples

Zum Letzten schauen wir einige Functional Interface an, einschließend gültig und ungültig und erklären, warum sie ungültig sind:
Die Interface IEquals unten ist keine functional interface denn die Methode "public boolean equals(Object)" ist ein von der Klasse Object geerbter Mitglied. Deshalb wird IEquals betrachtet, dass es keine abstraktive Methode hat und die Bedingungen für eine functional interface nicht erfüllt.
IEquals.java (Invalid!)
package org.o7planning.j8fi;

@FunctionalInterface
public interface IEquals {
    
   boolean equals(Object other);
}
Gültig:
IComparator.java (OK, Valid!)
package org.o7planning.j8fi;

@FunctionalInterface
public interface IComparator<T> {

    int compareTwoObject(T obj, T other);
    
    boolean equals(Object other);
}
Die Methode clone() der Klasse Object ist protected (nicht public). Deshalb wird die folgende Interface IWithClone als eine gültige functional interface.
IWithClone.java (OK, Valid)
package org.o7planning.j8fi;

@FunctionalInterface
public interface IWithClone {  
    
     Object clone();
}
Die Interface CC in die oben Abbildung ist eine gültige functional interface denn die von AA und BB geerbten abstraktiven Methode sind gleich.

3. die üblichen Functional Interface

Unten ist das die üblichen functional interface in Java:

Java Grundlagen

Show More