3312 Stimmen

Initialisierung einer ArrayList in einer Zeile

Ich wollte eine Liste von Optionen zu Testzwecken erstellen. Zuerst habe ich dies getan:

ArrayList<String> places = new ArrayList<String>();
places.add("Buenos Aires");
places.add("Córdoba");
places.add("La Plata");

Dann habe ich den Code wie folgt umstrukturiert:

ArrayList<String> places = new ArrayList<String>(
    Arrays.asList("Buenos Aires", "Córdoba", "La Plata"));

Gibt es eine bessere Möglichkeit, dies zu tun?

43 Stimmen

Wenn dies für Unit-Tests gedacht ist, sollten Sie Groovy einmal ausprobieren. Sie können Ihren Testcode in Groovy schreiben, während Sie Java-Code testen, und mit ArrasyList<String> places = ["Buenos Aires", "Córdoba", "La Plata"]

5 Stimmen

In Java SE 7 können Sie den parametrisierten Typ des Konstruktors durch eine leere Menge von Typparametern (<>) ersetzen: Map<String, List<String>> myMap = new HashMap<>();

2 Stimmen

48voto

Naman Punkte 21229

Mit java-9 und darüber, wie in JEP 269: Bequeme Fabrikmethoden für Sammlungen könnte dies erreicht werden durch Sammelliterale jetzt mit -

List<String> list = List.of("A", "B", "C");

Set<String> set = Set.of("A", "B", "C");

Ein ähnlicher Ansatz würde gelten für Map auch -

Map<String, String> map = Map.of("k1", "v1", "k2", "v2", "k3", "v3")

was ähnlich ist wie Sammlung Literale Vorschlag wie von @coobird angegeben. Auch in der GEP wird dies näher erläutert -


Alternativen

Sprachliche Änderungen wurden mehrfach in Erwägung gezogen und wieder verworfen:

Projekt Münzvorschlag, 29. März 2009

Projekt Münzvorschlag, 30. März 2009

JEP 186 Diskussion über lambda-dev, Januar-März 2014

Die Sprache Vorschläge wurden zugunsten eines bibliotheksbasierten Vorschlags zurückgestellt, der zusammengefaßt in diesem Nachricht.

Verwandt: Welchen Sinn haben überladene Convenience-Factory-Methoden für Collections in Java 9?

36voto

Mark Punkte 2577

Aufzählungsliterale haben es nicht in Java 8 geschafft, aber es ist möglich, die Stream-API zu verwenden, um eine Liste in einer ziemlich langen Zeile zu initialisieren:

List<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata").collect(Collectors.toList());

Wenn Sie sicherstellen müssen, dass Ihre List ist eine ArrayList :

ArrayList<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata").collect(Collectors.toCollection(ArrayList::new));

34voto

George Punkte 3393
import com.google.common.collect.ImmutableList;

....

List<String> places = ImmutableList.of("Buenos Aires", "Córdoba", "La Plata");

26voto

Jordão Punkte 53117

Sie könnten eine Fabrikmethode erstellen:

public static ArrayList<String> createArrayList(String ... elements) {
  ArrayList<String> list = new ArrayList<String>();
  for (String element : elements) {
    list.add(element);
  }
  return list;
}

....

ArrayList<String> places = createArrayList(
  "São Paulo", "Rio de Janeiro", "Brasília");

Aber es ist nicht viel besser als Ihr erstes Refactoring.

Für eine größere Flexibilität kann sie auch generisch sein:

public static <T> ArrayList<T> createArrayList(T ... elements) {
  ArrayList<T> list = new ArrayList<T>();
  for (T element : elements) {
    list.add(element);
  }
  return list;
}

14voto

Mohit Tyagi Punkte 2688

In Java 9 können wir einfach eine ArrayList in einer einzigen Zeile:

List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");

o

List<String> places = new ArrayList<>(List.of("Buenos Aires", "Córdoba", "La Plata"));

Dieser neue Ansatz von Java 9 hat viele Vorteile gegenüber den bisherigen Ansätzen:

  1. Weltraum-Effizienz
  2. Unveränderlichkeit
  3. Tresor

Weitere Einzelheiten finden Sie in diesem Beitrag -> Was ist der Unterschied zwischen List.of und Arrays.asList?

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