2つの機能が欲しいです。最初のは、コレクションが与えられると、述語を満たす要素を返します。述語は非常に高価になる可能性があり、結果が完全に消費されるわけではないため、最善の行動はビューを返すことであると考えました。したがって、一度実装すると、私のメソッドはGuavaのCollections2.filterをカプセル化するものにすぎません。
Collection<MyElement> getInterestingElements(Collection<MyElement> allElements) {
return Collections2.filter(allElements, new Predicate<MyElement>() {
@Override
public boolean apply(MyElement element) {
return element.isInteresting(); // call expensive function
}
});
}
(無実を保護するためにクラス名が変更されました)
2番目の関数は最初の関数を呼び出して次を返します。
- コレクションにゼロまたは複数の要素が含まれている場合はnull。
- コレクションに要素が1つしかない場合は、コレクションの唯一の要素。
つまり、この関数は、このコレクションがシングルトンである場合にのみ、コレクションのコンテンツを返します。
単純な実装は次のようになります。
MyElement getElementIfOnlyInterestingOne(Collection<MyElement> allElements) {
Collection<MyElement> interestingElements = getInterestingElements(allElements);
if (interestingElements.size() != 1){
return null;
}
return Iterables.first(interestingElements, null);
}
しかし、willへの呼び出しsize()
は(私が思うに)基礎となるコレクションのすべての要素の述語を評価します。最初の要素に興味がある場合、それは受け入れられません。
Iterables.getOnlyElement()を使用することもできますが、コレクションがシングルトンでない場合は例外がスローされます。これは頻繁に発生するはずであり、例外に依存してそれを行うのは悪い習慣だと思います。
したがって、手動で繰り返し、最初の要素を変数に格納し、2番目の要素がある場合はnullを返す必要があります。
私の質問は:これは問題ありませんが、私は車輪の再発明をしていませんか?グアバには非常に多くの魔法があるので、この問題はどこかで解決する必要がありisSingleton
ますgetSingleElementOrNull
:)