我有一个lambda
(a, b) -> {
a.doSomething();
a.doAnotherThing();
return b.doSomething();
}
现在,这只是在单个方法中用作参数。但是,我还想创建一个类似的lambda
(a) -> {
a.doSomething();
a.doAnotherThing();
return a
}
有什么方法可以重用我的代码吗?像
这样的东西(a, b) -> {
partial(a)
return b.doSomething();
}
(a) -> {
partial(a)
return a;
}
答案 0 :(得分:0)
如果我理解正确你想从另一个lambda调用lambda?
您可以给他们一个名字并像其他任何功能一样使用它们
Function<X,Y> partial = (a) -> {
a.doSomething();
a.doAnotherThing();
return a;
}
BiFunction<X,Y,Z> lam = (a, b) -> {
partial.apply(a);
return b.doSomething();
}
答案 1 :(得分:0)
我假设你在这里使用partial
并不是指部分函数的函数式编程概念。
查看您的示例,a
上的操作只是一个消费者,因为它们不返回任何值。您的可重用lambda可以这样声明:
Consumer<A> partial = a -> {
a.doSomething();
a.doAnotherThing();
}
要编写一个首先调用消费者的函数,您可以随时使用此帮助程序:
static <T,U,R> BiFunction<T,U,R> acceptAndThen(Consumer<T> c, Function<U,R> f){
return (t,u) -> {
c.accept(t);
return f.apply(u);
};
}
你可以用它来组成一个与你原来的函数相当的函数(我不知道b.doSomething()
的返回类型,我会假设C):
BiFunction<A,B,C> f1 = acceptAndThen(partial, B::doSomething); // equivalent to (a, b) -> { partial.accept(a); return b.doSomething(); }
您的第二个示例显示了如何以不同的方式重用partial
,将通过返回{{1}将另一个将Consumer<T>
转换为Function<T,T>
的帮助程序而受益} T
操作于:
Consumer<T>
所以你可以像这样创建你的第二个例子:
static <T> Function<T,T> returnSelf(Consumer<T> consumer){
return t -> {
consumer.accept(t);
return t;
};
}
这些组合不在标准库中,但您会发现像Function<A,A> f2 = returnSelf(partial); // equivalent to (a) -> { partial.accept(a); return a; }
和Consumer
这样的接口具有一些内置函数,用于将现有功能类型组合成新功能。例如,Function
有一个函数Consumer
,可以将消费者链接到按顺序调用。使用你的部分可能看起来像
andThen