Compor Java-8-Funcional-Interface
-
21-12-2019 - |
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
?
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 Runnable
s e A
s:
@FunctionalInterface
public interface A extends Runnable {
default void doIt() { run(); }
default A compose(Runnable next) {
return () -> { doIt(); next.run(); };
}
}