41

Guava 中是否有一种flatten方法 - 或将 an 转换为 an 的简单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;

我查看了 Guava 文档,但没有任何内容。我只是在检查我没有错过任何东西。否则,我会将我的三行提取到一个简短的 flatten 泛型方法中并保持不变。

4

2 回答 2

74

Iterables.concat 方法满足该要求:

public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs)
于 2011-05-10T11:31:02.017 回答
4

从 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();
}
于 2015-01-09T04:48:45.650 回答