在番石榴中压平可迭代<可迭代<T>>

2022-09-01 02:28:11

在番石榴中是否有一种方法 - 或者一种将a转换为一种简单的方法?flattenIterable<Iterable<T>>Iterable<T>

我有一个[sourceMultimap],我想返回键与某些谓词[key谓词]匹配的所有值。所以目前我有:Multimap<K, V>

Iterable<Collection<V>> vals = Maps.filterKeys(sourceMultimap.asMap(), keyPredicate).values();

Collection<V> retColl = ...;
for (Collection<V> vs : vals) retColl.addAll(vs);
return retColl;

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


答案 1

Iterables.concat 方法满足该要求:

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

答案 2

从Java 8开始,你可以在没有番石榴的情况下做到这一点。这有点笨拙,因为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();
}