Verarbeiten Sie eine beliebige Anzahl von Fällen in Java List

Einführung

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.

Referenz

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.

Implementiert

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 war süchtig nach

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

Ursache

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.

Lösung

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.

Nachtrag

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

Verarbeiten Sie eine beliebige Anzahl von Fällen in Java List
Listenaggregation in Java (Collectors.groupingBy)
Externe Prozessausführung in Java
Thread-sicherer Prozess in Java-Sprache
Liste der in Java 9 hinzugefügten Mitglieder
Liste der in Java 9 hinzugefügten Typen
Führen Sie einen externen Prozess in Java aus
Ändern Sie die Liste <Optional <T >> in Java in Optional <Liste <T >>
Unveränderlich (unveränderlich) Listet die Objektkonvertierungsfunktion in Java8 auf
[Java 7] Teilen Sie die Java-Liste und führen Sie den Prozess aus
Unterschied zwischen Arrylist und verknüpfter Liste in Java
Deklarieren Sie keine Variablen in List in Java
Java (Zufallszahl)
Partisierung in Java
Java-Pufferprozess
Java Memorandum (Liste)
Änderungen in Java 11
Janken in Java
Java-Überprüfungsprozess
Umfangsrate in Java
FizzBuzz in Java
Beispielcode zum Konvertieren von List in List <String> in Java Stream
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Janken App in Java
Einschränkungsprogrammierung in Java
Setzen Sie Java8 in Centos7
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Kommentare in der Java-Quelle
Azure funktioniert in Java
Formatieren Sie XML in Java
Einfache HTML-Spezialchars in Java
Boyer-Moore-Implementierung in Java
Hallo Welt in Java
Informationen zur Java-Array-Liste
Verwenden Sie OpenCV mit Java
Typbestimmung in Java
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Zabbix API in Java
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Fehler in Java ausdrücken
Erstellen Sie JSON in Java
Datumsmanipulation in Java 8
Was ist neu in Java 8?
Verwenden Sie PreparedStatement in Java
Was ist neu in Java 9,10,11
[Memo] Java Linked List
Ich schreibe einen Prozess, der sich in einer Listenschleife in Java (bei der Arbeit) ständig vergrößert (Liste). "
Parallele Ausführung in Java
[java] Nummer ablehnen → Zahl n-Zahl → Dezimalzahl
[Java, Stream] Sortieren Sie die Objektliste auf Japanisch nach dem Eigenschaftsnamen
Einfache Möglichkeit, die Methoden- / Feldliste in Java REPL zu überprüfen