Manipuler la liste avec java8StreamAPI :: reduction

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

Manipuler la liste avec java8StreamAPI :: reduction
Réduisez le code redondant avec Lombok
Essayez de manipuler les tableaux PostgreSQL avec JDBC
Créer une carte de liste avec LazyMap
[Java] Réduire les instructions if avec Enum
Tester les relations d'inclusion de liste avec AssertJ
Conversion de liste Java8 avec Stream map