17

Iterables.filter(Iterable, Predicate)Collections2.filter(Collection, Predicate)メソッドに違いがあるかどうか、グアバで知りたいですか?

それらは反復順序を維持し、ライブビューを提供しているようです。Javadoc によると、呼び出しCollections2.filter().size()はすべての要素を反復します。

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

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

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

と:

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

ところで、 のImmutableList構築は通常の の構築よりも高速ArrayListですか?

4

1 に答える 1

23

グアバの寄稿者はこちら。

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

コピーを行わないため、どちらのfilterメソッドもビューを返しますが、

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

は本質的に同等であり、同様にコピーせずに答えを見つけます。

ArrayListと を構築する相対速度に関しては、ImmutableList使用する構築方法によって異なります。

  • ImmutableList.copyOf(collection)ほぼ同じ時間がかかるはずです。(ヌルをチェックする必要がありますが、それは安価です。)
  • ImmutableList.builder()....build()追加される要素の数が事前にわからないため、ArrayList内でを使用する必要があるため、小さな定数係数が長くかかります。Builder
  • ImmutableList.of(...)ほぼ同じ速度になります。

とはいえ、頻繁にリストを渡す場合は特に、を使用することによる概念上の利点が、わずかなパフォーマンス コストを上回ることがよくあります。ImmutableList

于 2012-05-31T13:29:56.887 に答える