Сглаживание итерируемого <Iterable <T>> в гуаве - PullRequest
40 голосов
/ 10 мая 2011

Есть ли в Гуаве метод flatten или простой способ конвертировать Iterable<Iterable<T>> в Iterable<T>?

У меня есть Multimap<K, V> [sourceMultimap], и я хочу вернуть все значения, где ключ соответствует некоторому предикату [keyPredicate]. Итак, на данный момент у меня есть:

Iterable<Collection<V>> vals = Maps.filterKeys(sourceMultimap.asMap(), keyPredicate).values();

Collection<V> retColl = ...;
for (Collection<V> vs : vals) retColl.addAll(vs);
return retColl;

Я просмотрел документы по Гуаве, но ничего не выпрыгнуло. Я просто проверяю, я ничего не пропустил. В противном случае я извлеку свои три строки в короткий обобщенный общий метод и оставлю это так.

Ответы [ 2 ]

73 голосов
/ 10 мая 2011

Метод Iterables.concat удовлетворяет этому требованию:

public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs)
3 голосов
/ 09 января 2015

Начиная с Java 8, вы можете сделать это без гуавы.Это немного неуклюже, потому что Iterable напрямую не предоставляет потоки , что требует использования StreamSupport, но не требует создания новой коллекции, как код в вопросе.

...