2011-12-08 9 views
4

複数のソースオブジェクトから複数の値をコレクションに抽出する状況があります。私はGuavaの変換でこれを達成しようとしましたが、手動で「平坦化」しなければならないコレクションを回収するという問題に遭遇しました。フラットなコレクションに直接結果を戻す良い方法はありますか?Guavaで1から多数への変換

private static final Function<Target, Collection<Integer>> EXTRACT_FUNCTION = new Function<SourceObject, Collection<Integer>>() { 
    @Override 
    public Collection<Integer> apply(SourceObject o) { 
     // extract and return a collection of integers from o 
     return Lists.newArrayList(..); 
    } 
}; 

Collection<SourceObject> sourceObjects = ... 
Collection<Collection<Integer>>> nestedResults = transform(sourceObjects, EXTRACT_FUNCTION); 

// Now I have to manually flatten the results by looping and doing addAll over the nestedResults.. 
// Can this be avoided? 
Collection<Integer> results = flattenNestedResults(nestedResults); 

答えて

8

あなたが求めているどのようなグループ数反復可能な結果に

+0

これは正しいです。 Iterables.concatは、あなたのflattenNestedResults関数を置き換えます。 –

1

をグアバのIterables.concat(Iterable<E>... coll)を使用することができますreduce/fold方法です。未解決の問題があるが、現在Guavaはそれをサポートしていません。http://code.google.com/p/guava-libraries/issues/detail?id=218

は、多分それはあなたがFunctionを使用しますが、それを反復処理し、1つのコレクションに追加していない良いアイデアです。グアバは素晴らしいフレームワークですが、すべてを行うことはできません。

+0

'Iterables.concat(Iterable ... coll)'を知りませんでした。結果が 'Collection'の代わりに' Iterable'であることに気をつけていない場合は、これを使うことができます – wyz

+0

そしてもう一つの同様の問題があります:http: /code.google.com/p/guava-libraries/issues/detail?id=546 –

+2

本当にコレクションが必要な場合は、通常は 'Iterables.concat()'と 'Lists.newArrayList()などのコピーメソッドを組み合わせることができます) '、' ImmutableList.copyOf() '、' Sets.newHashSet() '、または' ImmutableSet.copyOf() 'です。反復可能なビューを返すことは、あなたのために任意に選択するのではなく、結果のコレクションタイプを選択できるので、非常に賢いです。また、実際のコレクションが不要な場合は、要素をコピーすることもありません。 –

関連する問題