在 Guava 中展平可迭代对象<Iterable<T>>

问题描述 投票:0回答:2
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;

我浏览了 Guava 文档,但没有任何结果。我只是检查一下我没有错过任何东西。否则,我会将我的三行代码提取到一个简短的扁平化通用方法中,然后保持原样。

java collections guava flatten
2个回答
74
投票

Iterables.concat 方法满足该要求:

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

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(); }
    
© www.soinside.com 2019 - 2024. All rights reserved.