2012-05-31 9 views
17

Iterables.filter(Iterable, Predicate)Collections2.filter(Collection, Predicate)の方法に違いがある場合は、Guavaで知りたいことがありますか?Guava:Iterables.filter VS Collections2.filter、大きな違いはありますか?

これらは、繰り返しの順序を維持し、ライブビューを提供するように見えます。 Javadocは、Collections2.filter().size()を呼び出すと、すべての要素を反復処理します。

私は、項目のリストをフィルタリングする述語があり、その結果、ビュー内に残っている項目の数(またはリストは関係ありません)が必要であるとします。私は何を使用するのですか? size()メソッドがCollectionによって提供されるので、Collections2.filterを使用する方が簡単です。

しかし、バックグラウンドで、違いがあります:

ImmutableList.copyOf(
    Iterables.filter(lead.getActions(), isRealActionDoneByUserPredicate) 
).size(); 

そして:ところで

Collections2.filter(lead.getActions(),isRealActionDoneByUserPredicate).size(); 

は、通常のArrayListを構築するよりも速くImmutableListを構築していますか?

+0

明らかに明白なことを述べておきましょう.1つは 'Iterable'、もう1つは' Collection'です。下の 'Collections2.filter'は' FilteredCollection'を使用します[link](https://code.google.com/p/guava-libraries/source/browse/guava/src/com/google/common/collect/Collections2.java# 133)、多くのものを 'Iterables' /' Iterators'に委譲しているので、機能上の違いはありません。例えば、 'FilteredCollection#size()'は@Louis Wassermanの答えにあるとおり、正確に 'Iterators.size(Iterators.filter(unfiltered.iterator()、predicate))'です。 –

答えて

22

Guava投稿者はこちらです。

Collections2.filter(elements, predicate).size() 

それがコピーを行わないように、好ましい - 両方filter方法はビューを返す - しかし

Iterables.size(Iterables.filter(elements, predicate)) 

が本質的に等価であり、同様に任意コピーせずに答えを見つけるだろう。

ImmutableListArrayListを構築するとの相対速度に関しては、それはあなたが使用した施工方法によって異なります。

  • ImmutableList.copyOf(collection)は、ほぼ正確に同じ時間を取る必要があります。
  • ImmutableList.builder()....build()は、Builderの中にArrayListを使用しなければならないため、一定の係数を小さくする必要があります。これは、追加する要素の数が事前に分からないためです。
  • ImmutableList.of(...)は、ほぼ等しいスピードを持ちます。言っ

ImmutableListを使用しての概念の利点は、多くの場合、あなたが頻繁に周りのリストを渡すことがあります場合は特に、小さなパフォーマンスのコストを上回ります。

+0

ありがとうございます。私はあなたがIterables.size()を意味すると思うIterables.length()が見つかりません –

+0

はい、私の悪い。一定。 –

+0

接線ですが、あなたが 'int expectedSize'を取る' builder'saコンストラクタを与えて(対応する 'builder(int)'メソッドを公開していると思っていますか)、またはAPIに追加されたノイズに対してあまり効果がないでしょうか? –

関連する問題