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?

Était-ce utile?

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 Runnablesable As :

@FunctionalInterface
public interface A extends Runnable {
    default void doIt() { run(); }
    default A compose(Runnable next) {
      return () -> { doIt(); next.run(); };
  }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top