转换设置为列表而不创build新的列表

我正在使用此代码将一个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); } 

我想避免在循环的每个迭代中创build一个新的列表。 那可能吗?

您可以使用List.addAll()方法。 它接受一个Collection作为参数,而你的设置是一个Collection。

 mainList.addAll(set); 

编辑:作为对问题编辑的回应。
很容易看出,如果你想要一个带有ListMap作为值,为了有k个不同的值,你需要创buildk个不同的列表。
因此:根本无法避免创build这些列表,必须创build列表。

可能的解决方法:
Map声明为Map<String,Set>Map<String,Collection> ,然后插入你的set。

使用构造函数来转换它:

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

也可以从Guava Collect库中,使用newArrayList(Collection)

 Lists.newArrayList([your_set]) 

这和以前的答案非常相似,除了你不需要声明(或实例化)任何list对象。

我们可以在Java 8中使用以下一个class轮:

 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()); } 

我会做 :

 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); } 

您可以使用这一行更改: 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()]))); } 

最近我find了这个

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

我创build了简单的static方法:

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

…或者如果你想设置types的列表你可以使用:

 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; } 

我发现这个工作很好,有用的创build一个列表从一个集合。

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

Java 8提供了使用stream的选项,您可以从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不保证它。 如上所述:

对返回的List的types,可变性,可串行性或线程安全性没有保证; 如果需要更多的对返回列表的控制,请使用toCollection(Supplier)。

如果你想确保总是那么你可以要求一个实例具体为:

 List<String> stringArrayList = setString.stream() .collect(Collectors.toCollection(ArrayList::new)); 
 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)); }