11

I was looking around for some elegant solution to removing null values from a List. I came across the following post, which says I can use list.removeAll(Collections.singletonList(null));

This, however, throws an UnsupportedOperationException, which I'm assuming is because removeAll() is attempting to do some mutative operation on the immutable singleton collection. Is this correct?

If this is the case, what would be a typical use of this singletonList? To represent a collection of size 1 when you're sure you don't want to actually do anything with the collection?

Thanks in advance.

4

3 に答える 3

17

それは魅力のように機能します:

List<String> list = new ArrayList<String>();
list.add("abc");
list.add(null);
list.add("def");
list.removeAll(Collections.singletonList(null));
System.out.println(list);  //[abc, def]

IndeedCollections.singletonList(null)は不変ですが (残念ながら Java [1]には隠されています)、変数から例外がスローされますlist。以下の例のように、どうやらそれも不変です。

List<String> list = Arrays.asList("abc", null, "def");
list.removeAll(Collections.singletonList(null));

このコードUnsupportedOperationException. ご覧singletonList()のとおり、この場合は便利です。クライアント コードが読み取り専用リストを想定している (それを変更しない) 場合に使用しますが、その中に 1 つの要素のみを渡したい場合に使用します。singletonList()(スレッド) セーフ (不変性のため)、高速でコンパクトです。

[1]たとえば、では、変更可能なコレクションと不変のコレクションに別々の階層があり、API は、これを受け入れるか、他のものを受け入れるか (または両方、共通の基本インターフェースを持っているため) を選択できます。

于 2012-06-26T10:48:52.353 に答える
1

あなたのリストはで保護されていますか

Collections.unmodifiableList(list)

それを保護して後で変更しようとすると、そのエラーが発生するためです。

于 2012-06-26T10:51:01.290 に答える