Java 链lambda函数

Java 链lambda函数,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,当Java方法接受函数Java 8函数s时,可以使用以下方法链接: UnaryOperator trimFunction=String::trim; UnaryOperator toUpperCaseFunction=String::toUpperCase; Stream.of(“a”,“b”).map(trimFunction.and(toUpperCaseFunction))//流现在是[“a”,“b”] 请注意,在您的实际示例中,String::trim不会编译,因为trim方法不接受任

当Java方法接受
函数Java 8
函数
s时,可以使用以下方法链接:

UnaryOperator trimFunction=String::trim;
UnaryOperator toUpperCaseFunction=String::toUpperCase;
Stream.of(“a”,“b”).map(trimFunction.and(toUpperCaseFunction))//流现在是[“a”,“b”]

请注意,在您的实际示例中,
String::trim
不会编译,因为
trim
方法不接受任何输入,因此它不符合函数接口
Function
(同样适用于
String::toUpperCase
),只需编写
myString->myString.trim().toUpperCase()
。坦率地说,所有可用的“语法甜美”选项实际上都更丑陋。将lambda存储在变量中,编写一个特殊的静态方法,等等,这些都比简单的事情更痛苦。它有点像C中的“函数指针”,因此我们可以通过函数名来引用函数。“连锁”这项业务毫无意义。点(.)没有链接,它们是嵌套的-
a.f().g()==(a.f()).g()
。我们也可以嵌套
:)@bvdb:您可以组合
操作符。由于
x::y
是一个表达式,因此形式
(x::y)::z
表示形式表达式::name。不幸的是,左侧没有类型,因此不起作用,但如果它有类型,则它是函数类型,因为表达式
x::y
生成函数。因此,将在函数类型中搜索
z
,而函数类型不是您想要的,因为您希望在结果类型中搜索
z
。但是改变表达式嵌套的工作方式是没有意义的,因为已经有了一种方法来表示您想要的:
x->y().z()
。您可以将它转换为任何一个抽象方法接口,但是如上所述,这意味着在该接口中搜索第二个方法,而不是在返回类型中。所以
((函数)x::y)::apply
将是有效的,但没有用处。它不会创建功能链。如果
函数
有一个
静态
方法,比如
,接受两个
函数
s,这样您就可以编写
函数。链(x::y,r::z)
,而
r
y()
的结果类型。但是,与
x->x.y().z()
相比,它仍然没有任何优势。具有N个参数的实例方法是一种具有N+1个参数的函数;额外的参数是
。因此我们可以做
UnaryOperator trimFunc=String::trim
@bayou.io我不知道你能做这件事。我用你的建议编辑了我的帖子。它也符合功能。。。
// on a specific object, without lambda
myString.trim().toUpperCase()
// something like: (which doesn't work)
String::trim::toUpperCase
// example: (which does not exist)
FunctionUtil.chain(String::trim, String::toUpperCase);
UnaryOperator<String> trimFunction = String::trim;
UnaryOperator<String> toUpperCaseFunction = String::toUpperCase;
Stream.of(" a ", " b ").map(trimFunction.andThen(toUpperCaseFunction)) // Stream is now ["A", "B"]