コレクションのGoogle Guava isNullOrEmpty


102

Guavaには文字列用のisNullOrEmptyユーティリティメソッドがあることがわかります

Strings.isNullOrEmpty(str)

リストにも同様のものはありますか?何かのようなもの

Lists.isNullOrEmpty(list)

これは

list == null || list.isEmpty()

また、配列にも同様のものはありますか?何かのようなもの

Arrays.isNullOrEmpty(arr)

これは

arr == null || arr.length == 0

回答:


141

いいえ、この方法はグアバには存在せず、実際には「アイデア墓地」にあります。

「is nullまたはempty」が、コレクションについて本当に知りたい質問であるとは考えていません。

コレクションがnullである可能性があり、nullを空と同じように扱う必要がある場合は、次のように、あいまいさを完全に排除します。

Set<Foo> foos = NaughtyClass.getFoos();
if (foos == null) {
  foos = ImmutableSet.of();
}

またはこのようにします(ご希望の場合):

Set<Foo> foos = MoreObjects.firstNonNull(
    NaughtyClass.getFoos(), ImmutableSet.<Foo>of());

以降は.isEmpty()通常通りご利用いただけます。いたずらなAPIを呼び出すとすぐにこれを実行してください。そうすれば、無期限に継続させるのではなく、奇妙さを取り戻すことができます。

そして、「本当に空のコレクションを意味するnull」があなたに返されずに渡された場合、あなたの仕事は簡単です:ただNullPointerException投げられるようにして、その呼び出し元を形作るだけです。


7
一部のフレームワークがフィールドをnullに設定していて、オブジェクトで空のリストを明示的に設定して使用しているにもかかわらず、それを制御できない場合(リストへのバインド時にスプリングフレームワーク)はどうなりますか。
OMax 2012年

15
私の答えも同じnullです。できるだけ早く空のコレクションに正規化して、あいまいさを取り除いてください。できない場合は、大丈夫です。自分の簡単なisNullOrEmpty(Collection)ヘルパーを本当に作成したいユーザーの1%未満である可能性があります。
Kevin Bourrillion、2012年

8
(または、ヘルパーをスキップして、if (collection == null || collection.isEmpty())必要な場合はただ書いてください!そんなに悪いのですか?)
Kevin Bourrillion '28

13
これは、実際にはまったく問題に対応していない独断的な回答です。また、防御的なプログラミングの原則に反します。
2013年

11
@Neovibrant質問はグアバライブラリの機能に関するものであり、答えはグアバの主要開発者の1人からのものであるため、答えはちょっと暗示されています:「いいえ、グアバにはありません」。答えはそのステートメントから始めることで改善されるかもしれません:)
Grundlefleck '11 / 10/21

37

グアバ全体でよく見られる傾向の1つは、nullS に対して非常に拮抗する傾向があるということです。作者nullはあなたがおそらくあなたが使うのと同じくらい使うことを思いとどまらせたいと思っています、そして使いやすくするためにユーティリティメソッドを提供することnullはこの目的に対して逆効果になります。

Guavaのパラダイムを使用する場合は、このコレクション(または配列)のソースがオプションでを返す必要があるかどうかを検討してnullください。そうでない場合は、それ@NonNullをマークして、ではなく空のコレクションを返すことを検討してくださいnull。または、値のないnullリストを予期している関数のパラメーターとして、を使用することを検討してくださいPreconditions.checkNotNull。これは、null(予期せずに)が渡された場合に例外をスローします。

null本当に合法であれば、list == null || list.isEmpty()それほど難しくはありません。


9
それは矛盾しています。Stringsについても同じことが言えます、Strings.isNullOrEmpty()があります
Don Cheadle

29

commons-collectionsにはCollectionUtils.isEmpty()があります。


1
残念ながら、最近のバージョンでは削除されているようです。org.apache.commons.collections15.CollectionUtilsを参照してください。
spaaarky21

1
apache.commons.collectionからのJavadocを見ると、メソッドisEmpty()およびisNotEmpty()は最新バージョンにまだ存在しています。collections15.CollectionUtilsは、一般的なサポートを提供しようとする独立したプロジェクトのようです。
proko 2012

1
CollectionUtils.isEmpty()は、レガシーアプリを使用していて、事前のコードを変更できない場合に役立ちます。
Jerome Dalbert、2012年

1
私たちはこれを知っていますが、1つはApache Commonsについてではなく、Guavaについて尋ねていました。
へKraの

9

Spring Frameworkには、という特殊なutilクラスがありCollectionUtilsます。そして、あなたが探している方法は次のとおりorg.springframework.util.CollectionUtils.isEmptyです。nullおよび空のコレクションに対してtrueを返します。

配列にはorg.springframework.util.ObjectUtils.isEmpty、ほぼ同じように動作するメソッドがあります。


5
おそらく安全に使用できますが、このクラスには「主にフレームワーク内での内部使用」というコメントが付けられています。つまり、Springのアップグレード時にインターフェイスが変更される可能性があり、再び機能させるには追加の作業を行う必要があります。
Mike Minicki

2

Apache CollectionUtils 4には、コレクションがnullの場合に空のリストを返すメソッドCollectionUtils.emptyIfNull()があります。これはforeachループで非常に便利なので、反復する前にnullチェックを行う必要はありません。


1

私の解決策は:MoreObjects.firstNonNull(list、Collections。emptyList())

JDKコレクションでGuava MoreObjectsを使用しています。

 @Test
public void listnull() {
List<String> list = null;

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}

list = new ArrayList<String>();
list.add("http://stackoverflow.com/");

for (String str : MoreObjects.firstNonNull(list, Collections.<String> emptyList())) {
    System.out.println(str);
}
}

1
これは、を使用しないことを除いて、まさにトップアンサーで提案されているものですImmutableList
dimo414

apache commonsのメソッドinNotEmptyのようなシンプルで迅速な解決策が必要だったので、否定的だと思います...
Kra

ヘルプセンター>権限>投票投票はいつ投票する必要がありますか?ずさんなずさんな、努力を費やさない投稿、または明らかにそしておそらく危険なほど不正確な回答に遭遇したときはいつでも、反対票を使用してください。1日あたりの投票数には限りがあり、回答への反対投票は、それに加えてごくわずかな評判しかかかりません。それらを賢く使ってください。stackoverflow.com/help/privileges/vote-down
jeton

私の答えは「ずさんにずさんな、努力なしの投稿、または明らかにそしておそらく危険なほど正しくない答え」だと思いますか?そうでない場合、なぜあなたは否定的な投票をしているのですか?
jeton 2015

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.