Was für eine Liste gibt Collectors.toList() zurück?

Lesezeit: 3 Minuten

Benutzer-Avatar
skiwi

ich lese State of the Lambda: Bibliothekenausgabeund bin von einer Aussage überrascht:

Unter dem Abschnitt Strömeda steht folgendes:

List<Shape> blue = shapes.stream()
                         .filter(s -> s.getColor() == BLUE)
                         .collect(Collectors.toList());

Das Dokument sagt nicht, was shapes tatsächlich ist, und ich weiß nicht, ob es überhaupt eine Rolle spielt.

Was mich verwirrt ist folgendes: Was für Beton List kommt dieser Codeblock zurück?

  • Es weist die Variable a zu List<Shape>was völlig in Ordnung ist.
  • stream() Noch filter() entscheiden, welche Art von Liste verwendet werden soll.
  • Collectors.toList() keine gibt den konkreten Typ von an List.

Na und Beton Typ (Unterklasse) von List wird hier verwendet? Gibt es Garantien?

  • Seit der toUnmodifiableList() -Methode in Java 10 hinzugefügt wurde, scheint es, dass die Veränderlichkeit von toList() konnte nun gewährleistet werden.

    – jaco0646

    28. März 2020 um 15:04 Uhr

Benutzer-Avatar
Rohit Jain

Welcher konkrete Typ (Unterklasse) von Liste wird hier also verwendet? Gibt es Garantien?

Schaut man sich die Dokumentation von an Collectors#toList()es sagt, dass – “Es gibt keine Garantien für den Typ, die Veränderlichkeit, die Serialisierbarkeit oder die Thread-Sicherheit der zurückgegebenen Liste.”. Wenn Sie möchten, dass eine bestimmte Implementierung zurückgegeben wird, können Sie verwenden Collectors#toCollection(Supplier) stattdessen.

Supplier<List<Shape>> supplier = () -> new LinkedList<Shape>();

List<Shape> blue = shapes.stream()
            .filter(s -> s.getColor() == BLUE)
            .collect(Collectors.toCollection(supplier));

Und aus dem Lambda können Sie jede gewünschte Implementierung zurückgeben List<Shape>.

Aktualisieren:

Oder Sie können sogar die Methodenreferenz verwenden:

List<Shape> blue = shapes.stream()
            .filter(s -> s.getColor() == BLUE)
            .collect(Collectors.toCollection(LinkedList::new));

  • Weißt du, du könntest diesen Lieferanten als Lambda schreiben 🙂

    – Joeri Hendrickx

    20. Februar 2014 um 15:51 Uhr

  • Möchten .collect(Collectors.toCollection(LinkedList<Shape>::new)) auch Arbeit?

    – skiwi

    20. Februar 2014 um 16:05 Uhr

  • @skiwi Oder noch besser mit explizitem Typargument: Collectors.<Shape, List<Shape>>toCollection(LinkedList<Shape>::new)

    – Rohit Jain

    20. Februar 2014 um 16:15 Uhr

  • @panos unmodifizierbare Liste ist eine “unveränderliche Claytons”, aber Sie schreiben am Ende Ihren eigenen Kollektor, wenn Sie eine tatsächlich unveränderliche Sammlung wünschen, z. B. eine von Guava. Wenn man ein wenig darüber nachdenkt, ist die eigentliche Schande, dass toList() gar keine unveränderliche Liste zurückgibt.

    – Hakanai

    26. September 2017 um 1:48 Uhr

  • @Trejkaz Stimmen Sie zu, toList hätte überhaupt eine unveränderliche zurückgeben sollen, aber na ja, das tat es nicht. Wir hoffen, dies irgendwann ändern zu können. Und was ist ein “unveränderlicher Claytons”?

    – Stuart Marks

    23. November 2017 um 21:00 Uhr

Beim Navigieren durch Netbeans (Strg + Klicken) bin ich in diesem Code gelandet. Es scheint eine ArrayList als Lieferant zu verwenden.

public static <T> Collector<T, ?, List<T>> toList() {
    return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                               (left, right) -> { left.addAll(right); return left; },
                               CH_ID);
}

  • Beachten Sie, dass dies nur eine mögliche Implementierung der API ist. 🙂

    – Hakanai

    20. April 2015 um 0:56 Uhr

  • @ Trejkaz Richtig. Tatsächlich erwägen wir ernsthaft, die Implementierung irgendwann zu ändern.

    – Stuart Marks

    23. November 2017 um 20:55 Uhr

Es spielt keine Rolle, aber der konkrete Typ ist nicht generisch, da tatsächlich alle Typen zur Laufzeit nicht generisch sind.

Welcher konkrete Typ (Unterklasse) von Liste wird hier also verwendet? Gibt es Garantien?

Ich glaube nicht, aber ArrayList oder LinkedList scheinen wahrscheinlich.

1228870cookie-checkWas für eine Liste gibt Collectors.toList() zurück?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy