Die Anleitung zu Java 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.
Java Grundlagen
- Anpassen von Java-Compiler, der Ihre Annotation verarbeitet (Annotation Processing Tool)
- Java Programmierung für Team mit Eclipse und SVN
- Die Anleitung zu Java WeakReference
- Die Anleitung zu Java PhantomReference
- Komprimierung und Dekomprimierung in Java
- Konfigurieren von Eclipse zur Verwendung des JDK anstelle von JRE
- Java-Methoden String.format() und printf()
- Syntax und neue Funktionen in Java 8
- Die Anleitung zu Java Reguläre Ausdrücke
- Die Anleitung zu Java Multithreading Programming
- JDBC Driver Bibliotheken für verschiedene Arten von Datenbank in Java
- Die Anleitung zu Java JDBC
- Holen Sie sich die automatisch erhöhenden Wert der Spalte bei dem Insert eines Rekord, der JDBC benutzt
- Die Anleitung zu Java Stream
- Die Anleitung zu Java Functional Interface
- Einführung in Raspberry Pi
- Die Anleitung zu Java Predicate
- Abstrakte Klasse und Interface in Java
- Zugriffsmodifikatoren (Access modifiers) in Java
- Die Anleitung zu Java Enum
- Die Anleitung zu Java Annotation
- Vergleichen und Sortieren in Java
- Die Anleitung zu Java String, StringBuffer und StringBuilder
- Die Anleitung zu Java Exception
- Die Anleitung zu Java Generics
- Manipulieren von Dateien und Verzeichnissen in Java
- Die Anleitung zu Java BiPredicate
- Die Anleitung zu Java Consumer
- Die Anleitung zu Java BiConsumer
- Was ist erforderlich, um mit Java zu beginnen?
- Geschichte von Java und der Unterschied zwischen Oracle JDK und OpenJDK
- Installieren Sie Java unter Windows
- Installieren Sie Java unter Ubuntu
- Installieren Sie OpenJDK unter Ubuntu
- Installieren Sie Eclipse
- Installieren Sie Eclipse unter Ubuntu
- Schnelle lernen Java für Anfänger
- Geschichte von Bits und Bytes in der Informatik
- Datentypen in Java
- Bitweise Operationen
- if else Anweisung in Java
- Switch Anweisung in Java
- Schleifen in Java
- Die Anleitung zu Java Array
- JDK Javadoc im CHM-Format
- Vererbung und Polymorphismus in Java
- Die Anleitung zu Java Function
- Die Anleitung zu Java BiFunction
- Beispiel für Java Encoding und Decoding mit Apache Base64
- Die Anleitung zu Java Reflection
- Java-Remote-Methodenaufruf - Java RMI
- Die Anleitung zu Java Socket
- Welche Plattform sollten Sie wählen für Applikationen Java Desktop entwickeln?
- Die Anleitung zu Java Commons IO
- Die Anleitung zu Java Commons Email
- Die Anleitung zu Java Commons Logging
- Java System.identityHashCode, Object.hashCode und Object.equals verstehen
- Die Anleitung zu Java SoftReference
- Die Anleitung zu Java Supplier
- Java Aspect Oriented Programming mit AspectJ (AOP)
Show More
- Anleitungen Java Servlet/JSP
- Die Anleitungen Java Collections Framework
- Java API für HTML & XML
- Die Anleitungen Java IO
- Die Anleitungen Java Date Time
- Anleitungen Spring Boot
- Anleitungen Maven
- Anleitungen Gradle
- Anleitungen Java Web Services
- Anleitungen Java SWT
- Die Anleitungen JavaFX
- Die Anleitungen Oracle Java ADF
- Die Anleitungen Struts2 Framework
- Anleitungen Spring Cloud