0

Guava の Iterables フィルターを使用するのが大好きです。しかし、1 つの一般的なコード スニペットは次のようになります。

  List foo = Lists.newArrayList(Iterables.filter(someCollection, somePredicate));  
  if (foo.isEmpty) {  
    // do empty  
  } else {  
    int count = foo.size();  // do non-empty  
  }  

「foo」リストを実際に作成する必要がないため、これは無駄です。必要なのは、それが空かどうかを知り、要素の数を取得することだけです。

次のベスト プラクティスを知りたい: 1)リストをメモリに構築する時間を無駄にせず
にテストするにはどうすればよいか 2) すべてのエントリを反復せずにサイズを取得する方法はありますか? 3) #2 に対する非反復的な解決策がない場合は、単純に反復して count++ を実行する方がよいでしょうか? isEmpty()

4

3 に答える 3

7

FluentIterable.from(foo).filter(predicate).isEmpty()必要以上に反復しません。

ただし、サイズが必要な場合はFluentIterable.from(foo).filter(predicate).size()、要素を格納せず、述語に一致する要素をカウントアップするだけの を使用する必要があります。

于 2012-09-29T02:51:28.040 に答える
1

There's no way to get the size of a filtered Iterable without iterating because you don't know which elements will match. Why not just use Iterables.size? If no elements match your predicate, isEmpty will have to iterate through the whole collection anyway.

于 2012-09-29T14:06:25.837 に答える
1

ルイの答えは的を射ています。たまたま を使用しているのでCollection、 も使用できますCollections2.filter:

Collection<Foo> filteredFoos = Collections2.filter(foos, fooPredicate);
if (filteredFoos.isEmpty()) {
    ...
}

ドキュメントから:

unfiltered述語を満たすの要素を返します。返されるコレクションは のライブ ビューですunfiltered。一方への変更は他方に影響を与えます。

于 2012-09-29T02:57:24.853 に答える