Traitez n'importe quel nombre de cas dans la liste Java

introduction

Lors de l'implémentation du traitement avec Java List, vous pouvez dire "Je veux traiter 100 listes à la fois". N'est-il pas temps d'insérer en masse dans DB? Sans ça, je serais fou. C'est un mémo que vous ne devez pas oublier car il semble que vous ferez la même erreur en implémentant le traitement dit Bulk-like avec celui implémenté en Java.

référence

Il y avait un article auquel j'ai fait référence auparavant, et je l'utilise principalement, mais même si je l'ai recherché, il n'est pas sorti facilement. .. Je n'ai pas aimé ça. ,. ,. ,. , Si vous avez vu ce code, ou s'il s'agit de mon message, merci de me le faire savoir.

Mis en œuvre

public interface BulkHelper<T> extends Iterable<T> {
	
	/**
	 *Itérez une liste de la taille définie dans le premier argument.
	 * @param size La taille de la liste à traiter dans un batch
	 * @liste de paramètres Liste à traiter
	 */
	default void doMethod(int size, Consumer<? super List<T>> list) {
		final List<T> _list = new ArrayList<T>(size);
		for (T t : this) {
	        if(_list.size() == size) {
	        	list.accept(_list);
	        	_list.clear();
	        }
	        _list.add(t);
	    }
		if(_list.size() > 0) list.accept(_list);
	}
	
	/**
	 *Définissez la liste pour itérer.
	 *Cette méthode est obligatoire pour appeler.
	 * @param itr
	 * @return
	 */
	public static <T> BulkHelper<T> setList(Iterable<T> itr){
		return () -> itr.iterator();
	}
}

** Lors de l'utilisation **

public static void main(String[] args) {
		
  List<String> list = Arrays.asList("AAA", "BBB", "CCC", "DDD", "EEE", "FFF","GGG");
		
  BulkHelper.setList(list).doMethod(2, _list -> {
	  System.out.println(_list);
  });		
}

résultat

[AAA, BBB]
[CCC, DDD]
[EEE, FFF]
[GGG]

J'étais accro à

Je l'ai fait lorsque je voulais reconditionner le traitement par lots dans une liste et le traiter en parallèle.

public static void main(String[] args) {
	
	List<String> list = Arrays.asList("AAA", "BBB", "CCC", "DDD", "EEE", "FFF","GGG");
	
	List<List<String>> copyList = new ArrayList<>();
	BulkHelper.setList(list).doMethod(2, _list -> {
		copyList.add(_list);
	});
	
	copyList.parallelStream().forEach(System.out::println);
}

résultat

[[GGG], [GGG], [GGG], [GGG]]

Non. ,

Cause

Le traitement ici dans l'interface BulkHelper.

if(_list.size() == size) {
     list.accept(_list);
     _list.clear();
}
_list.add(t);

La destination de référence est toujours _list, et comme clear () et add () sont répétés, tous les éléments ont fait référence au [GGG] qui a été traité en dernier dans la liste. C'est juste une erreur.

Solution

BulkHelper.setList(list).doMethod(2, _list -> {
	ArrayList<String> clone = new ArrayList<>(_list);
	copyList.add(clone);
});

En fait, je veux faire quelque chose du côté de l'interface, mais ce que j'ai soudainement proposé, c'est de faire quelque chose de nouveau dans le processus.

Postscript

Grâce aux suggestions de @Kilisame et @ swordone, nous avons pu résoudre l'interface proprement comme suit! Je vous remercie!

public interface BulkHelper<T> extends Iterable<T> {
	
	/**
	 *La liste du premier argument est traitée pour chaque taille du deuxième argument.
	 * @liste de paramètres Liste à traiter
	 * @param size Taille de traitement en masse
	 * @param bulkList Traitement du contenu
	 */
	public static <T> void extract(List<T> list, int size, Consumer<? super List<T>> bulkList) {
	    for (int i = 0; i < list.size(); i += size) {
	        List<T> _list = new ArrayList<>(list.subList(i, Integer.min(i + size, list.size())));
	        bulkList.accept(_list);
	    }
	}
}

** Lors de l'utilisation **

public static void main(String[] args) {
	
	List<String> list = Arrays.asList("AAA", "BBB", "CCC", "DDD", "EEE", "FFF","GGG");
	
	List<List<String>> copyList = new ArrayList<>();
	BulkHelper.extract(list, 2, _list -> {
		copyList.add(_list);
	});
	
	copyList.parallelStream().forEach(System.out::println);
	
}

C'est rafraîchissant ~: star2:

Recommended Posts

Traitez n'importe quel nombre de cas dans la liste Java
Agrégation de listes en Java (Collectors.groupingBy)
Exécution de processus externe en Java
processus thread-safe en java
Liste des membres ajoutés dans Java 9
Liste des types ajoutés dans Java 9
Exécuter un processus externe en Java
Remplacez List <Optional <T >> par Optional <List <T >> en Java
Fonction de conversion d'objet de liste immuable (immuable) dans Java8
[Java 7] Divisez la liste Java et exécutez le processus
Différence entre les listes d'arry et les listes liées en Java
Ne déclarez pas de variables dans List en Java
java (nombre aléatoire)
Partition en Java
Processus de mise en mémoire tampon Java
Mémorandum Java (liste)
Changements dans Java 11
Janken à Java
Processus de vérification Java
Taux circonférentiel à Java
FizzBuzz en Java
Exemple de code pour convertir List en List <String> dans Java Stream
Lire JSON en Java
Implémentation de l'interpréteur par Java
Faites un blackjack avec Java
Application Janken en Java
Programmation par contraintes en Java
Mettez java8 dans centos7
NVL-ish guy en Java
Joindre des tableaux en Java
"Hello World" en Java
Commentaires dans la source Java
Fonctions Azure en Java
Formater XML en Java
Simple htmlspecialchars en Java
Implémentation Boyer-Moore en Java
Hello World en Java
A propos de la liste des baies Java
Utiliser OpenCV avec Java
Détermination de type en Java
Divers threads en java
Implémentation du tri de tas (en java)
API Zabbix en Java
Art ASCII à Java
Comparer des listes en Java
POST JSON en Java
Exprimer l'échec en Java
Créer JSON en Java
Manipulation de la date dans Java 8
Nouveautés de Java 8
Utiliser PreparedStatement en Java
Nouveautés de Java 9,10,11
[Mémo] Liste liée Java
Je suis comme écrire un processus qui ne cesse de s’augmenter (liste) dans une boucle de liste en Java (au travail) »
Exécution parallèle en Java
[java] Nombre de déclin → nombre n-aire nombre n-aire → nombre décimal
[Java, stream] Trier la liste d'objets en japonais par nom de propriété
Un moyen simple de vérifier la liste des méthodes / champs dans Java REPL