3

次のような Java-8-FunctionalInterface があります。

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

Function-Interface は -Method を提供しますcompose。私はそれを使用して、次のようなストリームを減らしたいA:

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

その結果、各Stream でそのメソッドAを呼び出すの関数が必要です。AdoIt

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

しかし、Aの実装者ではないため、そこでFunctionメソッド参照Function::composeはできません。Function(または)から拡張することはできませんSupplier。これは、2 つの抽象メソッド (自分自身のメソッドと からのメソッド) を持つことになるためFunctionです。

の関数を構成することを可能にするために、何ができAますか?

4

1 に答える 1

7

composeメソッドがFunctionインターフェイスから取得されなければならない理由はありません。あなたの場合、インターフェイスは(ではなく)戻り値を持つFunctionため適切ではなく、そのメソッドはある関数の結果を次の関数にフィードすることを目的としています。Functionvoidcompose

独自の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ため、 のサブインターフェースにしてs とsRunnableを混在させることもできることに注意してください。RunnableA

@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 に答える