Bevor etwas zu sagen über etwa Lambda-Ausdrücke oder funktionale Schnittstellen, haben wir über Ihren wirklich problematischen Fehler sprechen: Sie rufenrun()
auf einem Thread! Wenn Sie einen neuen Thread starten möchten, müssen Sie start()
auf der Instanz Thread
aufrufen, wenn Sie den Code der Reihe nach ausführen möchten, erstellen Sie kein Thread
(aber nur ein Runnable
).
Das besagt, gibt es einige default
Methode auf den funktionalen Schnittstellen von Java 8 zum Kombinieren von Funktionen, z. Sie können zwei Function
s über Function.andThen(…)
verketten, aber die verfügbaren Kombinationen sind weit davon entfernt, vollständig zu sein.
Wenn eine bestimmte Kombination von Aufgabe in der Anwendung wiederholt, können Sie prüfen, Utility-Methoden zu erstellen:
public static <T> Runnable bind(T value, Consumer<T> c) {
return()->c.accept(value);
}
public static <T,U> Consumer<U> compose(Function<U,T> f, Consumer<? super T> c) {
return u->c.accept(f.apply(u));
}
new Thread(bind("Hello 1", compose(upper, d))).start();
new Thread(bind("Hello 2", compose(lower, d))).start();
Aber diese drei Teile aussehen wie eine Aufgabe für den Stream API:
Stream.of("Hello 1").map(upper).forEach(d);
Stream.of("Hello 2").map(lower).forEach(d);
Ich habe die Erstellung des neuen Thread hier verlassen, wie es nicht ist irgendeinen Vorteil sowieso.
Wenn Sie wirklich parallele Verarbeitung möchten, können Sie es auf einer Pro-Zeichen-Basis tun können:
"Hello 1".chars().parallel()
.map(Character::toUpperCase).forEachOrdered(c->System.out.print((char)c));
aber es wird immer noch nicht jeder Vorteil der Einfachheit der Aufgabe und der fixen Gemeinkosten des Gegebenen Parallelverarbeitung.
Diese Lambdas sind alle ideale Kandidaten für die Verwendung von _method references_: System.out :: println, String :: toUpperCase. –