2015-09-09 8 views
8

Wenn eine Java-Methode eine Function<? super T, ? extends U> akzeptiert, dann ist es möglich, Methodenverweise in einer Syntax wie der folgenden bereitzustellen: .Chaining Lambda-Funktionen

Ich frage mich jedoch, ob es eine Möglichkeit gibt, mehrere Methodenaufrufe zu verketten. Hier ist ein Beispiel, um den Fall zu veranschaulichen.

// on a specific object, without lambda 
myString.trim().toUpperCase() 

Ich frage mich, ob es eine Syntax gibt, um dies in einen Lambda-Ausdruck zu übersetzen. Ich hoffe, dass etwas wie das Folgende ist:

// something like: (which doesn't work) 
String::trim::toUpperCase 

Gibt es alternativ eine Dienstprogrammklasse zum Zusammenführen von Funktionen?

// example: (which does not exist) 
FunctionUtil.chain(String::trim, String::toUpperCase); 
+0

Wie wäre es mit ['Function.andThen'] (https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html#andThen-java.util.function.Function -)? –

+2

Die kanonische Lösung besteht darin, _beenden Sie method references_, und schreiben Sie einfach "myString -> myString.trim(). ToUpperCase()". –

+0

@LouisWasserman eine hervorragende Problemumgehung. Aber ich habe wirklich auf mehr syntaktische Süße gehofft. – bvdb

Antwort

4

Java 8 Function s kann mit den andThen Verfahren verkettet werden:

UnaryOperator<String> trimFunction = String::trim; 
UnaryOperator<String> toUpperCaseFunction = String::toUpperCase; 
Stream.of(" a ", " b ").map(trimFunction.andThen(toUpperCaseFunction)) // Stream is now ["A", "B"] 

Beachten Sie, dass in Ihrem tatsächlichen Beispiel String::trim nicht kompiliert, da die trim Methode keine Eingabe angenommen hat, so tut es nicht konform mit der funktionalen Schnittstelle Function (dasselbe gilt für String::toUpperCase).

+2

eine Instanz-Methode mit N Args ist eine Art von Funktion mit N + 1 Args; der zusätzliche arg ist 'this'. Daher können wir 'UnaryOperator trimFunc = String :: trimmen' – ZhongYu

+1

@ bayou.io Ich wusste nicht, dass Sie das tun könnten. Ich habe meinen Beitrag mit Ihrem Vorschlag bearbeitet. – Tunaki

+2

entspricht es 'Function ' too ... – ZhongYu