在Guava中展平Iterable <Iterable <T >>

在Guava中是否有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; 

我已经浏览了番石榴文件,但没有跳出来。 我只是检查我没有错过任何东西。 否则,我将把我的三行提取到一个简短的扁平通用方法中,并保持原样。

Iterables.concat方法满足这一要求:

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

从Java 8开始,你可以在没有Guava的情况下做到这一点。 这有点笨重,因为Iterable不直接提供stream ,需要使用StreamSupport,但不需要像问题中的代码那样创build新的集合。

 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(); }