1086 Stimmen

Wie kann ich zwei Listen in Java verbinden?

Bedingungen: keine Änderung der ursprünglichen Listen; nur JDK, keine externen Bibliotheken. Bonuspunkte für einen Einzeiler oder eine JDK 1.3 Version.

Gibt es einen einfacheren Weg als:

List<String> newList = new ArrayList<String>();
newList.addAll(listOne);
newList.addAll(listTwo);

7 Stimmen

Wenn Sie tun dies ausschließlich für Iteration Zwecke siehe eine andere Frage - es gibt Google Guava und Java 8 Lösungen stackoverflow.com/questions/4896662/

0 Stimmen

Java 8-Lösung mit Utility-Methode: stackoverflow.com/a/37386846/1216775

0 Stimmen

Dies ist nur eine der vielen Unzulänglichkeiten der Java Collections API.

97voto

volley Punkte 6555

Wahrscheinlich nicht einfacher, aber faszinierend und hässlich:

List<String> newList = new ArrayList<String>() { { addAll(listOne); addAll(listTwo); } };

Verwenden Sie es nicht im Produktionscode... ;)

1 Stimmen

Unverantwortliche Verwendung der anonymen Klasse. Wie der OP sagte - verwenden Sie es nicht in der Produktion Code.

55 Stimmen

Hässlich und böse, genau wie fast jede Verwendung der doppelten Klammerinitialisierung. Es ist allerdings kürzer ;)

1 Stimmen

+1, schön. Obwohl Eclipse teilt über sechs Zeilen für mich, und sagt mir zu @SuppressWarnings("serial") . :-)

91voto

Martin Punkte 2133

Nicht einfacher, aber ohne Overhead bei der Größenänderung:

List<String> newList = new ArrayList<>(listOne.size() + listTwo.size());
newList.addAll(listOne);
newList.addAll(listTwo);

59voto

Yuri Geinish Punkte 16062

Ich habe diese Frage gefunden, als ich eine beliebige Anzahl von Listen verketten wollte, ohne mich um externe Bibliotheken zu kümmern. Also, vielleicht wird es jemand anderes helfen:

com.google.common.collect.Iterables#concat()

Nützlich, wenn Sie dieselbe Logik auf eine Reihe verschiedener Sammlungen in einem for() anwenden wollen.

12 Stimmen

Zum Beispiel: Lists.newArrayList(Iterables.concat(list1,list2));

0 Stimmen

Sollten Sie anrufen com.google.common.collect.Iterators#concat(java.util.Iterato‌​r<? extends java.util.Iterator<? extends T>>) 代わりに Iterables#concat() weil letztere noch Elemente in den temporären Link kopieren!

55voto

akhil_mittal Punkte 20953

Java 8 ( Stream.of y Stream.concat )

Die vorgeschlagene Lösung gilt für drei Listen, kann aber auch für zwei Listen angewendet werden. In Java 8 können wir die folgenden Funktionen nutzen Strom.von o Stream.concat als:

List<String> result1 = Stream.concat(Stream.concat(list1.stream(),list2.stream()),list3.stream()).collect(Collectors.toList());
List<String> result2 = Stream.of(list1,list2,list3).flatMap(Collection::stream).collect(Collectors.toList());

Stream.concat nimmt zwei Streams als Eingabe und erzeugt einen lazily concatenated stream, dessen Elemente alle Elemente des ersten Streams sind, gefolgt von allen Elementen des zweiten Streams. Da wir drei Listen haben, haben wir diese Methode verwendet ( Stream.concat ) zwei Mal.

Wir können auch eine Hilfsklasse mit einer Methode schreiben, die eine beliebige Anzahl von Listen annimmt (mit varargs ) und gibt eine verkettete Liste als zurück:

public static <T> List<T> concatenateLists(List<T>... collections) {
        return Arrays.stream(collections).flatMap(Collection::stream).collect(Collectors.toList()); 
}

Dann können wir diese Methode wie folgt nutzen:

List<String> result3 = Utils.concatenateLists(list1,list2,list3);

52voto

SpaceTrucker Punkte 12246

Hier ist eine Java 8-Lösung mit zwei Zeilen:

List<Object> newList = new ArrayList<>();
Stream.of(list1, list2).forEach(newList::addAll);

Bitte beachten Sie, dass diese Methode nicht angewendet werden sollte, wenn

  • den Ursprung der newList nicht bekannt ist und möglicherweise bereits mit anderen Threads geteilt wird
  • der Strom, der die newList ist ein paralleler Strom und der Zugriff auf newList ist nicht synchronisiert oder thread-sicher

aufgrund von Überlegungen zu Nebenwirkungen.

Die beiden oben genannten Bedingungen gelten nicht für den oben genannten Fall der Verbindung zweier Listen, so dass dies sicher ist.

Basierend auf diese Antwort zu einer anderen Frage.

18 Stimmen

Wenn ich mich nicht irre, wird dies eigentlich nicht empfohlen - docs.oracle.com/javase/8/docs/api/java/util/stream/ Siehe Abschnitt "Nebenwirkungen". > Von Seiteneffekten in Verhaltensparametern für Stream-Operationen wird im Allgemeinen abgeraten, da sie oft zu unwissentlichen Verstößen gegen die Anforderung der Zustandslosigkeit sowie zu anderen Gefahren für die Thread-Sicherheit führen können. In diesem Fall ist es also besser, Collectors.toList() zu verwenden.

0 Stimmen

@AntonBalaniuc Die Frage ist, ob dies wirklich eine Nebenwirkung ist. An diesem Punkt newList ist von keinem anderen Thread beobachtbar. Aber Sie haben Recht, dass dies wahrscheinlich nicht getan werden sollte, wenn nicht bekannt ist, wo der Wert von newList stammt (zum Beispiel wenn newList als Parameter übergeben wurde.

2 Stimmen

Ich bin neugierig, warum .forEach(newList::addAll); 代わりに .collect(Collectors.toList()); ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X