展平Iterable <iterable <t>&gt;在Guava </iterable <t>

时间:2011-05-10 11:11:12

标签: java collections guava flatten

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;

我查看了番石榴文档,但没有跳出来。我只是检查我没有错过任何东西。否则,我会将我的三行提取为一个简短的扁平泛型方法,并保留原样。

2 个答案:

答案 0 :(得分:73)

Iterables.concat method符合该要求:

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

答案 1 :(得分:3)

从Java 8开始,您可以在没有Guava的情况下执行此操作。它有点笨重,因为Iterable doesn't directly provide streams需要使用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();
}