501 Stimmen

Einfacher Weg zur Konvertierung von Iterable in Collection

In meiner Anwendung verwende ich eine Bibliothek eines Drittanbieters (Spring Data für MongoDB, um genau zu sein).

Die Methoden dieser Bibliothek geben zurück Iterable<T> , während der Rest meines Codes erwartet Collection<T> .

Gibt es irgendwo eine Methode, mit der ich das eine schnell in das andere umwandeln kann? Ich würde gerne vermeiden, einen Haufen von foreach Schleifen in meinem Code für eine so einfache Sache.

421voto

Thamme Gowda Punkte 10173

In JDK 8+, ohne Verwendung zusätzlicher Bibliotheken:

Iterator<T> source = ...;
List<T> target = new ArrayList<>();
source.forEachRemaining(target::add);

Edit: Der obige Beitrag ist für Iterator . Wenn Sie sich mit Iterable ,

iterable.forEach(target::add);

407voto

ColinD Punkte 106101

Guave können Sie Lists.newArrayList(Iterable) o Sets.newHashSet(Iterable) neben anderen ähnlichen Methoden. Dadurch werden natürlich alle Elemente in den Speicher kopiert. Wenn das nicht akzeptabel ist, denke ich, dass Ihr Code, der mit diesen Elementen arbeitet, folgende Methoden verwenden sollte Iterable statt Collection . Guava bietet auch bequeme Methoden, um Dinge zu tun, die man auf einem Computer tun kann. Collection unter Verwendung einer Iterable (wie zum Beispiel Iterables.isEmpty(Iterable) o Iterables.contains(Iterable, Object) ), aber die Auswirkungen auf die Leistung sind deutlicher.

119voto

xehpuk Punkte 7044

Prägnante Lösung mit Java 8 unter Verwendung von java.util.stream :

public static <T> List<T> toList(final Iterable<T> iterable) {
    return StreamSupport.stream(iterable.spliterator(), false)
                        .collect(Collectors.toList());
}

Seit Java 16 können Sie mit [Stream.toList()](https://docs.oracle.com/en/java/javase/16/docs/api/java.base/java/util/stream/Stream.html#toList()) :

public static <T> List<T> toList(final Iterable<T> iterable) {
    return StreamSupport.stream(iterable.spliterator(), false)
                        .toList();
}

102voto

Atreys Punkte 3713

Sie können dafür auch eine eigene Dienstprogrammmethode schreiben:

public static <E> Collection<E> makeCollection(Iterable<E> iter) {
    Collection<E> list = new ArrayList<E>();
    for (E item : iter) {
        list.add(item);
    }
    return list;
}

53voto

yegor256 Punkte 96888

IteratorUtils de commons-collections können helfen (obwohl sie in der neuesten stabilen Version 3.2.1 keine Generika unterstützen):

@SuppressWarnings("unchecked")
Collection<Type> list = IteratorUtils.toList(iterable.iterator());

Version 4.0 (die sich derzeit in SNAPSHOT befindet) unterstützt Generika und Sie können die @SuppressWarnings .

Update: Überprüfung IterableAsList de Kakteen .

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