anchor.diff:    }
   ----
   
  -N'est-ce pas grandiose ? nous avons pu réecrire le pattern décorator avec très peu de ligne de code. 
  -Le JDK 8 donne la possibilité de composer plusieurs fonctions entre elles via la "default" méthode "andThen". Cette méthode est proposée dans les fonctions par défaut du JDK et le DoubleUnaryOperator en fait partie.
  -On démarre à partir de la classe DefaultProfitCalculator, et via "andThen" on compose ce traitement avec une autre fonction. Dans cet exemple, des appels par référence de méthode ont été privilégiés afin d'avoir un code plus concis et plus expressif "Expenses::getOperatingExpenses", mais des lambdas expression auraient également fait l'affaire "e -> Expenses.getOperatingExpenses(e)".
  -
  -Ainsi, il devient très simple d'ajouter ou de supprimer des decorators. Dans l'exemple ci dessous nous supprimons le decorator qui représente les dépenses exceptionnelles : 
  +N'est-ce pas grandiose ? Nous avons pu réecrire le pattern décorator avec très peu de lignes de code. 
  +Le JDK 8 donne la possibilité de composer plusieurs fonctions entre elles via la "default" méthode "andThen". Cette méthode est proposée dans les fonctions par défaut du JDK, dont le DoubleUnaryOperator fait partie.
  +On démarre à partir de la classe DefaultProfitCalculator, et via "andThen" on compose ce traitement avec une autre fonction. Dans cet exemple, des appels par référence de méthode ont été privilégiés afin d'avoir un code plus concis et plus expressif (Expenses::getOperatingExpenses), mais des lambdas expression auraient également pu faire l'affaire (e -> Expenses.getOperatingExpenses(e)).
  +
  +Ainsi, il devient très simple d'ajouter ou de supprimer des decorators. Dans l'exemple ci-dessous nous supprimons le decorator qui représente les dépenses exceptionnelles : 
   
   [source,java]
   ----
  
positive.code: 
  == b) Decorator en Java 8 avec l'API Stream
  
  Dans cette partie nous allons voir qu'il est possible d'implémenter le pattern decorator avec l'API Stream.
  Nous allons créer une classe appelée "StreamDecorator" correspondant à une enum singleton (instance unique). Cette classe contient une méthode appelée "calculateProfit" qui sera exposée au client de l'API : 
  
  [source,java]
  
negative.code: }
  ----
  
  Le principe ici est de passer une suite de fonctions representée par des DoubleUnaryOperator (équivalent à un tableau de fonctions). La méthode prend également en paramètre le CA.
  L'API stream propose une "factory method" "of" permettant d'initialiser une Stream à partir d'un tableau. Nous utilisons ensuite la méthode "reduce" qui permet de réduire les éléments du flux à une seule valeur.
  
  En programmation fonctionnelle le reduce correspond à du "fold". Le principe est de passer 2 fonctions, une initiale (et valeur par défaut) et l'autre permettant d'accumuler des éléments. Il devient très simple avec ce type d'opérateur de calculer la somme des élements d'une liste.
  