在Java中结合lambdas?

时间:2016-04-19 23:15:06

标签: java function lambda dry

我有一个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;
}

2 个答案:

答案 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