What is the use of singletonList?

前端 未结 3 1151
予麋鹿
予麋鹿 2021-01-04 11:28

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.

相关标签:
3条回答
  • 2021-01-04 11:43

    It works like a charm:

    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]
    

    Indeed Collections.singletonList(null) is immutable (which is unfortunately hidden in Java[1]), but the exception is thrown from your list variable. Apparently it is immutable as well, like in example below:

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

    This code will throw an UnsupportedOperationException. So as you can see singletonList() is useful in this case. Use it when client code expects a read-only list (it won't modify it) but you only want to pass one element in it. singletonList() is (thread-)safe (due to immutability), fast and compact.

    [1] E.g. in scala there is a separete hierarchy for mutable and immutable collections and API can choose whether it accept this or the other (or both, as they have common base interfaces)

    0 讨论(0)
  • 2021-01-04 11:45

    To answer your actual question :

    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?

    The typical use is if you have one element and want to pass it to a method that accepts a List, ie

    public void registerUsers(List<User> users) {...}
    
    User currentUser = Login Manager.getCurrentUser();
    registerUsers(Collections.singletonList(currentUser));
    

    The removeAll() is a special case for this.

    0 讨论(0)
  • 2021-01-04 11:51

    Has your list been protected with

    Collections.unmodifiableList(list)
    

    Because if you have protected it and try to modify it later you get that error.

    0 讨论(0)
提交回复
热议问题