Java实用程序方法结合两个lambdas?

Jos*_*lds 4 java lambda java-8

在.NET中,有一种简单的方法可以组合两个委托(.NET的lambda版本).

基本上,你有:

LambdaType f1 = (a, b) => doSomething(a, b);
LambdaType f2 = (a, b) => doSomethingElse(a, b);
LambdaType combined = System.Delegate.Combine(f1, f2); 
// combined is equiv to: (a, b) => { f1.invoke(a, b); f2.invoke(a, b);};
Run Code Online (Sandbox Code Playgroud)

在Java中是否有这样的结合两个lambdas?什么都没想到.它是一个不错的小实用程序,虽然说实话上并不太难以定义只调用两个(或更多)的第二个lambda.

Jac*_*ack 11

你在谈论Java 8 lambdas吗?因为存在这样的实用程序,例如:

Predicate<Foo> pred1 = f -> true; 
Predicate<Foo> pred2 = pred1.and(f -> false);
Run Code Online (Sandbox Code Playgroud)

要么

Function<Int,Int> func1 = x -> x + 1;
Function<Int,Int> func2 = func1.andThen(x -> x*2);
Run Code Online (Sandbox Code Playgroud)

您应该查看java.util.function包,因为您可能会发现该功能已经可用.

在您的具体示例中,您不是在编写两个函数,实际上,从功能上讲,您不能编写两个接受两个参数并返回一个参数(或void)的函数.

这是因为您缺少要求:第一个函数的codomain必须对应于第二个函数的,否则无法完成组合.

你在这里真正做的是顺序调用具有相同参数的两个不相关的函数.这个问题可以通过做同样的事情来解决:

BiConsumer<Foo,Bar> combination = (f,b) -> { doSomething(f,b); doSomethingElse(f,b); };
Run Code Online (Sandbox Code Playgroud)