Wenn Sie die Verarbeitung mit Java List implementieren, können Sie sagen "Ich möchte 100 Listen gleichzeitig verarbeiten". Ist es nicht an der Zeit, eine Masseneinfügung in die Datenbank vorzunehmen? Ohne das wäre ich verrückt. Es ist ein Memo, das Sie nicht vergessen sollten, da es den Anschein hat, als würden Sie den gleichen Fehler machen, wenn Sie die sogenannte Bulk-ähnliche Verarbeitung mit der in Java implementierten implementieren.
Es gab einen Beitrag, auf den ich mich zuvor bezogen habe, und ich benutze ihn meistens, aber selbst wenn ich ihn nachgeschlagen habe, ist er nicht einfach herausgekommen. .. Es hat mir nicht gefallen. ,. ,. ,. , Wenn Sie diesen Code gesehen haben oder wenn es mein Beitrag ist, lassen Sie es mich bitte wissen.
public interface BulkHelper<T> extends Iterable<T> {
/**
*Iterieren Sie eine Liste der im ersten Argument festgelegten Größe.
* @param size Die Größe der Liste, die in einem Stapel verarbeitet werden soll
* @Parameterliste Zu verarbeitende Liste
*/
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);
}
/**
*Stellen Sie die Liste auf Iteration ein.
*Diese Methode muss unbedingt aufgerufen werden.
* @param itr
* @return
*/
public static <T> BulkHelper<T> setList(Iterable<T> itr){
return () -> itr.iterator();
}
}
** Beim Benutzen **
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);
});
}
Ergebnis
[AAA, BBB]
[CCC, DDD]
[EEE, FFF]
[GGG]
Ich habe dies getan, als ich die Stapelverarbeitung in eine Liste umpacken und parallel verarbeiten wollte.
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);
}
Ergebnis
[[GGG], [GGG], [GGG], [GGG]]
Nein. ,
Die Verarbeitung hier in der BulkHelper-Oberfläche.
if(_list.size() == size) {
list.accept(_list);
_list.clear();
}
_list.add(t);
Das Referenzziel ist immer _list, und da clear () und add () wiederholt wurden, beziehen sich alle Elemente auf das [GGG], das zuletzt in der Liste verarbeitet wurde. Es ist nur ein Fehler.
BulkHelper.setList(list).doMethod(2, _list -> {
ArrayList<String> clone = new ArrayList<>(_list);
copyList.add(clone);
});
Eigentlich möchte ich etwas auf der Schnittstellenseite tun, aber plötzlich fiel mir ein, dass ich innerhalb des Prozesses etwas Neues tun sollte.
Dank der Vorschläge von @Kilisame und @ Schwertone konnten wir die Benutzeroberfläche wie folgt ordentlich lösen! Vielen Dank!
public interface BulkHelper<T> extends Iterable<T> {
/**
*Die Liste des ersten Arguments wird für jede Größe des zweiten Arguments verarbeitet.
* @Parameterliste Zu verarbeitende Liste
* @param size Größe der Massenverarbeitung
* @param batchList Verarbeitet Inhalte
*/
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);
}
}
}
** Beim Benutzen **
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);
}
Es ist erfrischend ~: star2:
Recommended Posts