Pergunta

Eu tenho um Java-8-FunctionalInterface como este:

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

O Function-Interface fornece uma compose-Método.Eu quero usá-lo, para reduzir um fluxo de A como esta:

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

Como resultado, eu quero ter uma função de A, que chama cada um A o Fluxo de seu método doIt.

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

Mas porque Um não é um implementador de Function, o método de referência Function::compose não é possível lá.Eu não posso estender a partir de Function (ou Supplier), porque então eu teria dois métodos abstratos (o meu e o do Function).

O que posso fazer, para torná-lo possível, para compor o meu funções de A?

Foi útil?

Solução

Não há nenhuma razão para que o compose o método vem dos Function interface.Para o caso, o Function interface não é adequado como Function tem um valor de retorno (em vez de void e é compose método destina-se a alimentar o resultado de uma função para outra.

Basta fazer o seu próprio compose método:

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

Em seguida, você pode fazer como se pretende:

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

Note-se que desde a sua interface possui a mesma semântica como Runnable você pode até mesmo fazer uma sub-interface de Runnable para permitir a mistura de Runnables e As:

@FunctionalInterface
public interface A extends Runnable {
    default void doIt() { run(); }
    default A compose(Runnable next) {
      return () -> { doIt(); next.run(); };
  }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top