Le processus de division du processus en fonction de l'index de List, qui est courant dans la logique métier, peut également être implémenté à l'aide de réduire. Par exemple "Ajouter: autre que le début de la liste" Logique telle que peut être implémentée comme suit en utilisant
MyBusinessLogic.java
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction;
import java.util.stream.Stream;
public class MyBunessLogic {
public static void main(String args[]){
final BiFunction<List<String>, String, List<String>> operation =
(accum, value) -> {
if(accum.size()!=0)accum.add(" : "+value);
else accum.add(value);
return accum;
};
Stream.of("start","middle","end")
.reduce(new ArrayList<String>(),operation,(s,v)->s)
.forEach(System.out::print);
}
}
Résultat de sortie
start : middle : end
Postscript La signification du type BiFunction est difficile à comprendre, alors notez son utilisation. Les premier et second types de génériques sont les types d'arguments de fonction, le premier est l'accumulateur et le second est la valeur à calculer. Le troisième type de générique montre la valeur de retour lorsque la fonction est exécutée
Addendum 2 L'expression lambda passée au troisième argument de reduction est appelée lorsque la méthode pararell de la classe Stream est exécutée, mais l'exemple d'exemple donne une expression appropriée. En effet, l'exemple ci-dessus est destiné à traiter les listes dans l'ordre, et non à les traiter en parallèle. Personnellement, je pense que ce serait pratique si la méthode de réduction avait une surcharge de (U indentity, BiFunction \ <U, T, U > func), une méthode qui n'est pas destinée à un fonctionnement en parallèle.
Addendum 3 Dans l'exemple ci-dessus, la variable (accum) passée comme argument de l'expression lambda est exploitée de manière destructive, donc j'écrirai une version améliorée.
MyBunessLogic.java
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
public class MyBunessLogic {
public static void main(String args[]){
Stream.of("start","middle","end")
.reduce(new ArrayList<String>(),MyBunessLogic::operate,(s,v)->s)
.forEach(System.out::print);
}
private static List<String> operate(List<String> accum,String value){
List<String> list = new ArrayList<String>(accum);
if(list.size()!=0)list.add(" : "+value);
else list.add(value);
return list;
}
}
Recommended Posts