2015-09-09 19 views
8

JavaメソッドがFunction<? super T, ? extends U>を受け入れる場合、次のような構文でメソッド参照を提供することができます:MyClass::myMethodラムダ関数の連鎖

しかし、複数のメソッド呼び出しを連鎖させる方法があるかどうかは疑問です。 この例を示す例です。

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

これをラムダ式に変換する構文があるのだろうかと思います。

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

また、関数をマージするユーティリティクラスはありますか?実際の例では、trim方法は、任意の入力をとらないので、String::trimがコンパイルされませんので、それがないことを

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

注:

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

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

+2

標準的な解決法はメソッド参照を使用して_停止し、 'myString - > myString.trim()。toUpperCase()'と書くだけです。 –

+0

@LouisWassermanは優れた回避策です。しかし、私は本当により構文的な甘さを期待していました。 – bvdb

答えて

4

のJava 8 Function sが方法andThenを連鎖させることができます機能インタフェースFunctionに準拠していません(String::toUpperCaseも同じです)。

+2

N argsを持つインスタンスメソッドは、N + 1 argsを持つ関数の種類です。余分な引数は 'this'です。したがって、私たちは 'UnaryOperator trimFunc = String :: trim'を実行することができます – ZhongYu

+1

@ bayou.io私はあなたがこれを行うことができたか分かりませんでした。私は自分の提案を編集しました。 – Tunaki

+2

'Function 'に準拠しています... – ZhongYu

関連する問題