Java Language Réduction avec des flux


Exemple

La réduction est le processus consistant à appliquer un opérateur binaire à chaque élément d'un flux pour obtenir une valeur.

La méthode sum() d'un IntStream est un exemple de réduction; il applique une addition à chaque terme du Stream, résultant en une valeur finale: Réduction de somme

Ceci est équivalent à (((1+2)+3)+4)

La méthode de reduce d'un flux permet de créer une réduction personnalisée. Il est possible d'utiliser la méthode reduce pour implémenter la méthode sum() :

IntStream istr;
    
//Initialize istr
    
OptionalInt istr.reduce((a,b)->a+b);

La version Optional est renvoyée afin que les flux vides puissent être traités de manière appropriée.

Un autre exemple de réduction consiste à combiner un Stream<LinkedList<T>> en un seul LinkedList<T> :

Stream<LinkedList<T>> listStream;
    
//Create a Stream<LinkedList<T>>
    
Optional<LinkedList<T>> bigList = listStream.reduce((LinkedList<T> list1, LinkedList<T> list2)->{
    LinkedList<T> retList = new LinkedList<T>();
    retList.addAll(list1);
    retList.addAll(list2);
    return retList;
});

Vous pouvez également fournir un élément d'identité . Par exemple, l'élément d'identité pour l'addition est 0, comme x+0==x . Pour la multiplication, l'élément d'identité est 1, comme x*1==x . Dans le cas ci-dessus, l'élément identity est une LinkedList<T> vide LinkedList<T> , car si vous ajoutez une liste vide à une autre liste, la liste à laquelle vous "ajoutez" ne change pas:

Stream<LinkedList<T>> listStream;

//Create a Stream<LinkedList<T>>

LinkedList<T> bigList = listStream.reduce(new LinkedList<T>(), (LinkedList<T> list1, LinkedList<T> list2)->{
    LinkedList<T> retList = new LinkedList<T>();
    retList.addAll(list1);
    retList.addAll(list2);
    return retList;
});

Notez que lorsqu'un élément d'identité est fourni, la valeur de retour n'est pas encapsulée dans un élément Optional -si appelé sur un flux vide, reduce() renvoie l'élément d'identité.

L'opérateur binaire doit également être associatif , ce qui signifie que (a+b)+c==a+(b+c) . C'est parce que les éléments peuvent être réduits dans n'importe quel ordre. Par exemple, la réduction d'addition ci-dessus peut être effectuée comme suit:

Autre réduction de somme

Cette réduction équivaut à écrire ((1+2)+(3+4)) . La propriété d'associativité permet également à Java de réduire le Stream en parallèle. Une partie du flux peut être réduite par chaque processeur, avec une réduction combinant le résultat de chaque processeur à la fin.