Преобразовать в список без создания нового списка

Я использую этот код для преобразования Set в List:

Map<String, List> mainMap = new HashMap<String, List>();

for(int i=0; i<something.size(); i++){
  Set set = getSet(...); //return different result each time
  List listOfNames = new ArrayList(set);
  mainMap.put(differentKeyName,listOfNames);
}

Я хочу избежать создания нового списка на каждой итерации цикла. Возможно ли это?

Ответ 1

Вы можете использовать метод List.addAll(). Он принимает коллекцию в качестве аргумента, а ваш набор - это коллекция.

mainList.addAll(set);

ИЗМЕНИТЬ: в ответ на редактирование вопроса.
Легко видеть, что если вы хотите иметь Map с List как значения, чтобы иметь k разных значений, вам нужно создать k разных списков.
Таким образом: вы не можете вообще не создавать эти списки, списки должны быть созданы.

Возможная работа вокруг:
Объявите свой Map как Map<String,Set> или Map<String,Collection> вместо этого и просто вставьте свой набор.

Ответ 2

Используйте конструктор для его преобразования:

List<?> list = new ArrayList<?>(set);

Ответ 3

Также из библиотеки Guava Collect вы можете использовать newArrayList(Collection):

Lists.newArrayList([your_set])

Это будет очень похоже на предыдущий ответ от amit, за исключением того, что вам не нужно объявлять (или инициализировать) любой объект list.

Ответ 4

Мы можем использовать следующий один лайнер в Java 8:

List<String> list = set.stream().collect(Collectors.toList());

Вот небольшой пример:

public static void main(String[] args) {
        Set<String> set = new TreeSet<>();
        set.add("A");
        set.add("B");
        set.add("C");
        List<String> list = set.stream().collect(Collectors.toList());
}

Ответ 5

Я бы сделал:

Map<String, Collection> mainMap = new HashMap<String, Collection>();

for(int i=0; i<something.size(); i++){
  Set set = getSet(...); //return different result each time
  mainMap.put(differentKeyName,set);
}

Ответ 6

Вы можете использовать это однострочное изменение: Arrays.asList(set.toArray(new Object[set.size()]))

Map<String, List> mainMap = new HashMap<String, List>();

for(int i=0; i<something.size(); i++){
  Set set = getSet(...); 
  mainMap.put(differentKeyName, Arrays.asList(set.toArray(new Object[set.size()])));
}  

Ответ 7

Недавно я нашел это

ArrayList<T> yourList = Collections.list(Collections.enumeration(yourSet<T>));

Ответ 8

Я создаю простой метод static:

public static <U> List<U> convertSetToList(Set<U> set)
{
    return new ArrayList<U>(set);
}

... или если вы хотите установить тип списка, который вы можете использовать:

public static <U, L extends List<U>> List<U> convertSetToList(Set<U> set, Class<L> clazz) throws InstantiationException, IllegalAccessException
{
    L list = clazz.newInstance();
    list.addAll(set);
    return list;
}

Ответ 9

Я нашел эту работу прекрасной и полезной для создания списка из набора.

ArrayList < String > L1 = new ArrayList < String > ();
L1.addAll(ActualMap.keySet());
for (String x: L1) {
    System.out.println(x.toString());
}

Ответ 10

Java 8 предоставляет возможность использования потоков, и вы можете получить список из Set<String> setString как:

List<String> stringList = setString.stream().collect(Collectors.toList());

Хотя внутренняя реализация на данный момент предоставляет экземпляр ArrayList:

public static <T>
    Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }

но JDK не гарантирует этого. Как упоминалось здесь:

Нет никаких гарантий относительно типа, изменчивости, сериализуемости или безопасность потока возвращаемого списка; если больше контроля над возвращенным Список необходим, используйте toCollection (Поставщик).

Если вы хотите быть уверенным всегда, то вы можете запросить экземпляр специально как:

List<String> stringArrayList = setString.stream()
                     .collect(Collectors.toCollection(ArrayList::new));

Ответ 11

Map<String, List> mainMap = new HashMap<String, List>();

for(int i=0; i<something.size(); i++){
  Set set = getSet(...); //return different result each time
  mainMap.put(differentKeyName, new ArrayList(set));
}