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