2012-04-03 4 views
5

最近、コレクションに1つの要素しか存在しない場合、「特殊なケース」シナリオを実行する必要がありました。自家製のコレクションクラスの醜いので、私が作成した二つの方法が見えた...size() == 1のチェックと...iterator.next()を使用して取得:Guavaを使用して1つの要素のみが存在するかどうか確認してください

public class Collections { 
    public static <T> boolean isSingleValue(Collection<T> values) { 
     return values.size() == 1; 
    } 

    public static <T> T singleValue(Collection<T> values) { 
     Assert.isTrue(isSingleValue(values)); 
     return values.iterator().next(); 
    } 
} 

数日前、私はグアバはIterables.getOnlyElementというメソッドを持っていることを発見しました。それは私の必要性をカバーし、singleValueを置き換えますが、isSingleValueの一致が見つかりません。それは設計によるのですか? Iterables.isOnlyElementメソッドの機能要求を入れる価値はありますか?

EDIT: 私はグアバに強化を開くことを決めたいくつかのupvotesがあったので - issue 957が。ファイナル解像度 - 'WontFix'引数はThomas/Xaerxessが提供したものと非常によく似ています。

答えて

10

まあ、ヌルをチェックできる点を除いて、values.size() == 1をメソッドに置き換えることはあまり得られません。しかし、それを行うために、Apache Commons Collections(Guavaと同様、私も想定しています)のメソッドがあります。

私はむしろif(SomeHelper.isSingleValue(values))よりif(values.size() == 1)またはif(SomeHelper.size(values) == 1)
を書きたい - 目的は、最初の2つのアプローチでより明確であり、第三のアプローチのように記述するように多くのコードです。ただ、他の回答に加えて

6

(私は彼のものを削除@davebのようなものを書くつもりだった:正確に一つの要素が存在しない場合、Iterables#getOnlyElementIllegalArgumentExceptionまたはNoSuchElementExceptionをスローします) - なぜ質問への答えは、グアバにはIterables.isSingleValue(Iterable)はありません。

これは間違っていると思います。場合は、次の方法のinvokationが状態を変更しない

  • hasNext()が存在する理由イテレータでnext()とは異なり、それはだ)、あなたははっきりとexlicitly(nullMap#get(Object)から返されるとは異なり、返される値は例外的なケースではないと言うことができます - それはNULL値にすることができるか、それはそのキーが

方法の条件が真であるかどうかをチェックし、それに主張して(いくつかの操作をしている)のようにする必要はない)マップ内に見つかりませんでした意味することができます!サンプルコード。

この場所での反復可能性が1以外のサイズを持つことができない場合、条件チェックは冗長です(他の場合は例外がスローされます)。
空でないコレクションの最初の要素だけを取得したい場合 - collection.iterator.next()は完全にOKです(コレクションが空の場合はNoSuchElementExceptionがスローされます)。
コレクションのサイズについてわからない場合はIterables.getFirst(iterable, default)があなたのためです。

P.S. Collections#isSingleValueがローカルでのみ使用されている場合(したがってプライベートになる可能性がある場合)、は実際にはであり、Iterables#getOnlyValueを呼び出す前に確認する必要はありません。

P.P.S.グアバのデザインに関するあなたの質問に対する別の答えは、ジョシュア・ブロッホの項目57です。有効なJava - 私が以前に言及したグアバにはいくつかの異なるヘルパーメソッドがあります。ブールチェックはAPIをできるだけ小さく保つことで追加されませんでした。

0

私は同じ問題を抱えています。

私はこのコードで解決するよ:

public static <T> void hasJustOne(T... values) { 
    hasJustOne(Predicates.notNull(), values); 
} 

public static <T> void hasJustOne(Predicate<T> predicate, T... values) { 
    Collection<T> filtred = Collections2.filter(Arrays.asList(values),predicate); 
    Preconditions.checkArgument(filtred.size() == 1); 
} 
+0

これは明らかではない、「私は解決するよ」何を意味するのでしょうか?あなたはこれが解決策であると言っているのですか、問題に取り組んでいますか? –

+0

これは私にとっては解決策です。 – Falci

関連する問題