结合两个lambda的Java实用方法?

结合两个lambda的Java实用方法?,java,lambda,java-8,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.invo

在.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);};

Java中是否有类似的东西可以组合两个lambda?我什么都没想到。这将是一个很好的小实用程序,尽管老实说,定义第二个lambda只调用两个(或更多)并不太困难。

您是在谈论Java8lambda吗?因为存在这样的实用程序,例如:

Predicate<Foo> pred1 = f -> true; 
Predicate<Foo> pred2 = pred1.and(f -> false);
谓词pred1=f->true;
谓词pred2=pred1.and(f->false);

函数func1=x->x+1;
函数func2=func1,然后(x->x*2);
您应该看看这个软件包,因为您可能会发现该功能已经可用

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

这是因为您缺少一个要求:第一个函数的值必须与第二个函数的值相对应,否则无法进行合成

这里真正要做的是用相同的参数顺序调用两个不相关的函数。这个问题可以通过做完全相同的事情来解决:

BiConsumer<Foo,Bar> combination = (f,b) -> { doSomething(f,b); doSomethingElse(f,b); };
双消费者组合=(f,b)->{doSomething(f,b);doSomethingElse(f,b);}; 函数组合(也应用于谓词时)可能不是您想要的:它意味着将一个lambda应用于另一个lambda的返回类型。这有几个含义。特别是,您不能以这种方式编写
doSomething(a,b)
doSomethingElse(a,b)
,因为这两个函数都没有可能的返回类型来调用另一个函数

由于Java中也没有
LambdaType
(不幸的是),因此您必须选择特定的函数类型。一般来说,您将有两个函数,如下所示:

BiFunction<A,B,T> f0 = (a, b) -> doSomething(a, b); 
BiFunction<A,B,S> f1 = (a, b) -> doSomethingElse(a, b); 

(或您想要的任何返回类型…

由于您的请求似乎包含了不返回任何内容的函数,因此合适的Java 8类型应该是
BiConsumer
。这使您可以随心所欲:

BiConsumer<A,B> f1=(a,b) -> doSomething(a,b);
BiConsumer<A,B> f2=(a,b) -> doSomethingElse(a,b);
BiConsumer<A,B> combined = f1.andThen(f2);
双消费者f1=(a,b)->剂量测定法(a,b); 双消费者f2=(a,b)->剂量表hingelse(a,b); 双消费者组合=f1,然后(f2);
这依赖于为组合函数提供工厂方法的函数类型,而不是允许任意组合,另一方面,这允许有意义的组合,类似于
/
for
谓词
s,它们做了一些有用且可理解的事情,而不仅仅是调用这两个函数的代码并返回任意结果。

组合
的作用是什么?它是一个
,还是一个
?@kocko从外观上看,它是
。@MarkoTopolnik是正确的。你能告诉我们,对于带两个参数的函数(返回一个结果,或者可能是
无效的
),这是如何工作的吗?@Marco13:你不能组合两个具有不同密码域和域的函数。这毫无意义,检查我的编辑,但你已经在回答中指出了。你不一定是严格意义上的写作
BiConsumer
不是函数,但定义了
BiFunction<A,B,Void> f = (a,b) -> {
    doSomething(a,b); doSomethingElse(a,b); return null;
};
BiConsumer<A,B> f1=(a,b) -> doSomething(a,b);
BiConsumer<A,B> f2=(a,b) -> doSomethingElse(a,b);
BiConsumer<A,B> combined = f1.andThen(f2);