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.
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.
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]
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. ,
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.
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.
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