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;
グアバのドキュメントを調べましたが、何も飛び出していません。私は何も見逃していないことを確認しています。それ以外の場合は、3行を短いフラット化された汎用メソッドに抽出し、そのままにしておきます。
Iterables.concatメソッド はその要件を満たします:
public static <T> Iterable<T> concat(Iterable<? extends Iterable<? extends T>> inputs)
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();
}