3

我有一个这样的 Java-8-FunctionalInterface:

@FunctionalInterface
public interface A {
    void doIt ();
}

Function-Interface 提供了一个-Method compose。我想用它来减少这样的流A

Stream<A> as;
A composed = as.reduce (() -> {}, Function::compose);

结果我想要一个函数A,它调用每个AStream 的方法doIt

composed.doIt (); // Executes every doIt ()

但是因为 A不是的实现者Function,所以方法引用Function::compose在那里是不可能的。我不能从Function(或Supplier)扩展,因为那样我将有两个抽象方法(我自己的和一个来自Function)。

我可以做些什么来使我的功能成为可能A

4

1 回答 1

7

该方法没有理由compose必须来自Function接口。对于您的情况,该Function接口不合适,因为Function它具有返回值(而不是void),并且它的compose方法旨在将一个函数的结果提供给下一个函数。

只需制作自己的compose方法:

@FunctionalInterface
public interface A {
  void doIt ();
  default A compose(A next) {
      return () -> { doIt(); next.doIt(); };
  }
}

然后你可以按预期做:

Stream<A> as=…;
A composed = as.reduce (() -> {}, A::compose);

请注意,由于您的接口具有相同的语义,Runnable您甚至可以将其设置Runnable为允许混合Runnables 和As 的子接口:

@FunctionalInterface
public interface A extends Runnable {
    default void doIt() { run(); }
    default A compose(Runnable next) {
      return () -> { doIt(); next.run(); };
  }
}
于 2014-06-04T13:54:27.023 回答