wake-up-neo.net

funktionsoberflächen von Java 8 in Java 7

sind die Funktionsschnittstellen von Java 8 irgendwo verfügbar (d. h. in einem Jar), ​​damit ich sie in einem Java 7-Projekt verwenden kann? auf diese Weise könnte ich den Code später einfacher auf das idiomatische Java 8 portieren. Wenn nicht, ist dies technisch möglich oder werden neue Funktionen wie Standardmethoden verwendet?

ja, ich meinte die Schnittstellen in Java.util.function. Da das Hinzufügen von Paketen mit dem Java-Präfix anscheinend nicht zulässig ist, können diese nicht von einem anderen Ort importiert werden.

16
msung

Eine funktionale Schnittstelle ist einfach eine Schnittstelle mit nur einer nicht standardmäßigen, nicht statischen Methode. Alle Schnittstellen, die diese Definition erfüllen, können über ein Lambda in Java 8 implementiert werden.

Zum Beispiel ist Runnable eine funktionale Schnittstelle und in Java 8 können Sie schreiben: Runnable r = () -> doSomething();.

Viele der von Java 8 bereitgestellten funktionalen Schnittstellen befinden sich in dem Paket Java.util.function . Am häufigsten sind:

  • Consumer<T> der eine void accept(T t) hat
  • Supplier<T> der eine T get() hat
  • Function<T, R> der eine R apply(T t) hat
  • Predicate<T> der als boolean test(T t)

In dieser Phase könnten Sie einzelne Methodenschnittstellen verwenden, wo immer dies sinnvoll ist, wenn möglich mit ähnlichen Signaturen. Wenn Sie auf Java 8 migrieren, können Sie auf einfache Weise über Ihre IDE umgestalten von:

someMethod(new MyConsumer<T>() { public void accept(T t) { use(t); } });

in

someMethod(t -> use(t));

Ändern Sie dann die Signatur von someMethod(MyConsumer<T> mc) in someMethod(Consumer<T> c), entfernen Sie die Schnittstelle MyConsumer und fertig.

16
assylias

Hier finden Sie die Signaturen der wichtigsten Funktionsschnittstellen von Java 8 als Ergänzung zu assylias answer

public interface Consumer<T> {
    void accept(T t);
}

public interface Supplier<T> {
    T get();
}

public interface Function<T, R> {
    R apply(T t);
}

public interface Predicate<T> {
    boolean test(T t);
}
6
mkdev

Die Java 8-Funktionsschnittstellen sind begrenzt. Verwenden Sie die FunctionalJava-Typen P1, F, F2, F3, ..., F8, TryCatch0, TryCatch1, ..., TryCatch8, um das Gleiche jetzt mit mehr Funktionalität zu tun.

https://functionaljava.ci.cloudbees.com/job/master/javadoc/

Sie können das Retro Lambda-Projekt zum Kompilieren mit Java 8 und Lambdas verwenden, jedoch die Java 7-VM als Ziel festlegen. Dies vermeidet den ganzen anonymen Unsinn der inneren Klasse. Ein Beispiel finden Sie im FunctionalJava-Projekt ( http://www.functionaljava.org/ ).

1
Mark Perry

Zusätzlich zu der Antwort von @assylias, die meines Erachtens das Problem in den meisten Fällen löst, gibt es noch eine Option: Erstellen Sie Ihren eigenen @FunctionalInterface und behalten Sie diesen bei.

Es hängt davon ab, wo Sie die Funktionen verwenden. Alle oben genannten Schnittstellen können von JDK-Dienstprogrammklassen verwendet werden. Predicate erlaubt das Filtern, Supplier erlaubt das Erstellen von Objekten, Function erlaubt das Mappen ... Tatsächlich sind Predicate und Supplier ziemlich einfach, aber Function und Consumer können oft unklar sein, insbesondere BiFunction. In einigen Anwendungsfällen können Sie sich auch die Hände binden.

Sie können Ihre eigene Schnittstelle schreiben, die über eine beliebige Anzahl von Eingaben verfügt, geprüfte Ausnahmen auslöst und nur dort Generika enthält, wo Sie sie benötigen. Der Name gibt an, wofür sie verwendet werden soll.

//@FunctionalInterface
public interface MyCustomInterface {
    <T> MyCustomOutput myCustomAction(MyCustomInput<T> str) throws MyCustomException;
}

Obwohl die mit JDK bereitgestellten Schnittstellen nützlich sind, ziehen Sie es manchmal vor, Ihre eigene Lösung auch in Java 8 beizubehalten, nur mit den Anmerkungen und Lambdas anstelle von anonymen Klassen.

0
Vlasec