web-dev-qa-db-ja.com

グアバでIterable <Iterable <T >>を平坦化する

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行を短いフラット化された汎用メソッドに抽出し、そのままにしておきます。

41
Andy Whitfield

Iterables.concatメソッド はその要件を満たします:

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

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();
}
4
Jeffrey Bosboom