Composer une interface fonctionnelle Java-8
-
21-12-2019 - |
Question
J'ai une interface Java-8-FunctionalInterface comme celle-ci :
@FunctionalInterface
public interface A {
void doIt ();
}
Le Function
-L'interface fournit un compose
-Méthode.Je veux l'utiliser, pour réduire un flux de A
comme ça:
Stream<A> as;
A composed = as.reduce (() -> {}, Function::compose);
En conséquence, je veux avoir une fonction de A
, qui fait appel à chacun A
du Stream sa méthode doIt
.
composed.doIt (); // Executes every doIt ()
Mais parce qu'A n'est pas un exécutant de Function
, la référence de la méthode Function::compose
n'est pas possible là-bas.Je ne peux pas m'étendre de Function
(ou Supplier
), car j'aurais alors deux méthodes abstraites (la mienne et celle de Function
).
Que puis-je faire, pour permettre, de composer mes fonctions de A
?
La solution
Il n'y a aucune raison pour que compose
la méthode doit venir du Function
interface.Pour votre cas, le Function
l'interface n'est pas appropriée car Function
a une valeur de retour (plutôt que void
) et son compose
La méthode est destinée à introduire le résultat d’une fonction dans la suivante.
Créez simplement le vôtre compose
méthode:
@FunctionalInterface
public interface A {
void doIt ();
default A compose(A next) {
return () -> { doIt(); next.doIt(); };
}
}
Ensuite, vous pouvez faire comme prévu :
Stream<A> as=…;
A composed = as.reduce (() -> {}, A::compose);
Notez que puisque votre interface a la même sémantique que Runnable
vous pourriez même en faire une sous-interface de Runnable
pour permettre le mélange de Runnable
sable A
s :
@FunctionalInterface
public interface A extends Runnable {
default void doIt() { run(); }
default A compose(Runnable next) {
return () -> { doIt(); next.run(); };
}
}