Подтвердить что ты не робот

Сглаживание Iterable <Iterable <T>> в Гуаве

Есть ли способ 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;

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

4b9b3361

Ответ 1

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

public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs)

Ответ 2

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

private static <T> Iterable<T> concat(Iterable<? extends Iterable<T>> foo) {
    return () -> StreamSupport.stream(foo.spliterator(), false)
        .flatMap(i -> StreamSupport.stream(i.spliterator(), false))
        .iterator();
}