链接lambda函数

bvd*_*vdb 12 java lambda java-8 java-stream

当Java方法接受a时Function<? super T, ? extends U>,可以使用如下语法提供方法引用:MyClass::myMethod.

但是,我想知道是否有一种链接多个方法调用的方法.这是一个说明案例的例子.

// on a specific object, without lambda
myString.trim().toUpperCase()
Run Code Online (Sandbox Code Playgroud)

我想知道是否有语法将其转换为lambda表达式.我希望有类似的东西:

// something like: (which doesn't work)
String::trim::toUpperCase
Run Code Online (Sandbox Code Playgroud)

或者,是否有一个实用程序类来合并函数?

// example: (which does not exist)
FunctionUtil.chain(String::trim, String::toUpperCase);
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 8

Java 8 Function可以使用以下方法链接andThen:

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

请注意,在您的实际示例中,String::trim由于该trim方法不接受任何输入,因此无法编译,因此它不符合功能接口Function(同样适用String::toUpperCase).

  • 一个带有N args的实例方法是一种具有N + 1个args的函数; 额外的arg是`this`.因此我们可以做`UnaryOperator <String> trimFunc = String :: trim` (2认同)
  • 它符合`Function <String,String>`太...... (2认同)