Использование Java Collections.singletonList ()?

164

Какая польза от Collections.singletonList()Java? Я понимаю, что он возвращает список с одним элементом. Зачем мне нужен отдельный метод для этого? Как неизменность играет роль здесь?

Существуют ли какие-либо особые полезные варианты использования этого метода, а не просто удобный метод?

PlagueHammer
источник
6
Вот пример того, как это может быть полезно - stackoverflow.com/a/1239631/360811
shabunc
1
возможный дубликат Arrays.asList () против Collections.singletonList ()
sschuberth
1
@sschuberth, пожалуйста, сравните даты для вопросов. ОП не знал, что он / она может дублировать будущий вопрос
KumarAnkit
Да, @KumarAnkit, но ссылки на дубликаты по-прежнему полезны для людей, которые ищут альтернативные / потенциально лучшие ответы. На самом деле, я считаю, что связывание как дубликат следует рассматривать как двунаправленную вещь, и лучшие вопросы / ответы следует сохранять независимо от того, старше они или новее.
19
@sschuberth, хорошая мысль, но это следует отнести к категории похожих, как этот вопрос здесь.
KumarAnkit

Ответы:

159

Javadoc говорит , что это:

«Возвращает неизменный список, содержащий только указанный объект. Возвращенный список сериализуем.»

Ты спрашиваешь:

Зачем мне нужен отдельный метод для этого?

Прежде всего для удобства ... чтобы вам не пришлось писать последовательность утверждений для:

  • создать пустой список объектов
  • добавить элемент к нему, и
  • оберните это неизменной оберткой.

Это также может быть немного быстрее и / или сэкономить немного памяти, но маловероятно, что эти небольшие сбережения будут значительными. (Приложение, которое создает огромное количество одноэлементных списков, по меньшей мере необычно.)

Как неизменность играет роль здесь?

Это часть спецификации метода; смотри выше.

Существуют ли какие-либо особые полезные варианты использования этого метода, а не просто удобный метод?

Ясно, что есть случаи, когда удобно использовать singletonListметод. Но я не знаю, как бы вы (объективно) различали обычный вариант использования и «особенно полезный» ...

Стивен С
источник
26

Вот один взгляд на одноэлементные методы:

Я обнаружил, что эти различные «одноэлементные» методы полезны для передачи одного значения в API, который требует сбора этого значения. Конечно, это работает лучше всего, когда код, обрабатывающий переданное значение, не нужно добавлять в коллекцию.

Джим Ферранс
источник
Можете ли вы помочь мне понять эту часть комментария выше? «Конечно, это работает лучше всего, когда код, обрабатывающий переданное значение, не нужно добавлять в коллекцию». Я не получил это.
Бильбо Бэггинс
2
Я думаю, что он ссылается на неспособность изменить переданный список, поскольку он является неизменным.
Даниэль Хигерас
2
@BilboBaggins - Это утверждение было ироничным. :-) Фраза «это работает лучше всего, когда ...» более точно написана «это работает только тогда, когда ...».
Стивен К.
18

Из javadoc

@param  the sole object to be stored in the returned list.
@return an immutable list containing only the specified object.

пример

import java.util.*;

public class HelloWorld {
    public static void main(String args[]) {
        // create an array of string objs
        String initList[] = { "One", "Two", "Four", "One",};

        // create one list
        List list = new ArrayList(Arrays.asList(initList));

        System.out.println("List value before: "+list);

        // create singleton list
        list = Collections.singletonList("OnlyOneElement");
        list.add("five"); //throws UnsupportedOperationException
        System.out.println("List value after: "+list);
    }
}

Используйте его, когда код ожидает список только для чтения, но вы хотите передать в него только один элемент. singletonList(поток-) безопасно и быстро.

salsinga
источник
Спасибо, это лучший ответ. Вы даже приводите пример, а не просто говорите: «Ясно, что есть варианты использования, но я не знаю о них».
theprogrammer
3

Чтобы ответить на ваш неизменный вопрос:

Collections.singletonListсоздаст неизменный список. Неизменяемый список (также называемый неизменяемым списком) не может быть изменен. Методы добавления или удаления элементов будут вызывать исключения, если вы попытаетесь изменить содержимое.

Одиночный список содержит только этот элемент и не может быть изменен.

ajain
источник
2

Если коллекции Immutable / Singleton ссылаются на коллекцию, которая имеет только один объект и которая больше не модифицируется, то такая же функциональность может быть достигнута путем создания коллекции "UnmodifiableCollection", имеющей только один объект. Поскольку такая же функциональность может быть достигнута с помощью Unmodifiable Collection с одним объектом, то для чего предназначается Singleton Collection?

Anonumous
источник
Создайте неизменяемую коллекцию с одним объектом «обычным» способом и с помощью метода синглтона. Тогда вы сразу видите, почему.
Кап
1

singletonList может содержать экземпляр любого объекта. Состояние объекта можно изменить.

List<Character> list = new ArrayList<Character>();
list.add('X');
list.add('Y');
System.out.println("Initial list: "+ list);
List<List<Character>> list2 = Collections.singletonList(list);
list.add('Z');
System.out.println(list);
System.out.println(list2);

Мы не можем определить unmodifiableList как выше.

Sarang
источник