将BiFunction转换为Java函数

时间:2019-07-10 23:27:42

标签: java lambda java-8

假设我有以下枚举:

public enum Foo {

  AAA(new A()::doA),
  BBB(new B()::doB),
  CCC(new C()::doC),
  DDD(new D()::doD);

  private Function<String, Number> do;

  Foo(Function<String, Number> do) {
    this.do = do;
  }

  public Function<String, Number> getDo() {
    return do;
  }  
}

知道我必须保持getDo方法具有完全相同的签名。

这很好,如果我执行AAA.getDo().apply("two"),结果将得到2。 但是问题在于,每次对do方法的调用都将始终在A,B,C和D的相同实例上进行。但是,我需要A,B,C或D成为不同的对象(因为这些类都有字段,并且我不希望这些字段在do方法的每次调用中都保留其值)。

我想到了这样的东西:

AAA(
  A.class,
  A::doA);

但是在这种情况下,A::doA不再是A实例上的Function,而是BiFunction,我需要将A实例作为第一个参数传递给它。 但是我的getDo方法仍然必须返回一个Function,并且我看不到将BiFunction和我的A类转换为实例上的Function的任何方法(我们可以想象:(A::DoA).toFunction(A.class)这样的东西)

1 个答案:

答案 0 :(得分:2)

方法引用new A()::doA绑定到评估A来创建new A()::doA实例时创建的一个Function对象,即,枚举值{{1 }}正在创建。 AAA将立即执行,并返回对其new A()方法的引用,就像您曾经使用过doA()一样。

解决此问题的方法是使函数本身以不立即运行的逻辑调用构造函数:

someInstanceOfA::doA