17

私はGoogleGuavaが大好きで、それをよく使用していますが、私がいつも書いている方法が1つあります。

 public static <T> T tryFind(Iterable<T> iterable, Predicate<T> predicate){
     for(T t : iterable){
         if(predicate.apply(t)){
              return t;
         }
     }
     return null;
  }

私にとって、これはIterablesIteratorsそのことに関しても)非常に便利な追加であるように思われるので、なぜそれが欠落しているのか疑問に思います。NoSuchElementExceptionまた、おそらくnullを見つけることと要素を見つけないことを区別するために、をスローするメソッドを持つことのポイントを理解できますが、その状況は、使用している述語が次の場合にのみ発生します。

public boolean apply(T t){
     return t==null;
}

これは一般的なケースではないようです。

では、なぜguavaの設計者は、それが見つからない場合にnullを返すのではなく、この動作を選択したのでしょうか。

これが[Iterables.find()][1]のjavadocです。

[1]: http: //google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#find (java.lang.Iterable、com.google.common.base。述語)

4

5 に答える 5

31

デフォルト値を受け入れるfind()の別のオーバーロードを追加しています。

于 2010-06-23T06:13:53.733 に答える
13

nullが有効な戻り値であるためと考えられます。一般的に、nullをサポートしない正当な理由がない限り、nullをサポートする必要があります。サポートされている場合は、それが存在する場合を処理する必要があります。

于 2010-06-23T05:52:30.600 に答える
5

tryFind()の代わりに、filterを使用して、空のコレクションが返されるかどうかを確認できます。

コレクションを常に操作する方が、オブジェクトに直接質問するよりもクリーンであることがわかりました。

于 2010-06-23T06:03:07.957 に答える
3

私の意見では、NoSuchElementExceptionは、NPEをデバッグするのが遅く、非常に難しいよりも優れています...ほとんどの場合、「コレクション」内のオブジェクトを検索すると、おそらくそれが見つかることがわかります。探しているオブジェクトが「コレクション」にない場合は、例外的なケースに直面しています...私によると、NoSuchElementExceptionフィードバックは、意味のない「null」よりも明示的です。

将来のguavaリリースで導入されるデフォルト値は、例外的なケースを処理するための効率的なショートカットになります。

于 2010-06-23T22:56:07.437 に答える
0

デフォルト値を見つけるのではなく、見つけることができなかった場合、検索は理にかなっています。

Optional<T> Iterables.find(Iterable<T>, Predicate<? super T>)
于 2013-04-10T14:03:34.520 に答える