我正在使用这段代码将一个Set转换为一个List:
Map<String, List<String>> mainMap = new HashMap<>();
for (int i=0; i < something.size(); i++) {
Set<String> set = getSet(...); //returns different result each time
List<String> listOfNames = new ArrayList<>(set);
mainMap.put(differentKeyName, listOfNames);
}
我希望避免在循环的每次迭代中创建一个新列表。这可能吗?
您可以使用List.addAll()方法。它接受一个集合作为参数,您的集合就是一个集合。
List<String> mainList = new ArrayList<String>();
mainList.addAll(set);
编辑:作为对问题编辑的回应。
很容易看出,如果您想要有一个带有列表作为值的Map,为了有k个不同的值,您需要创建k个不同的列表。
因此:您根本无法避免创建这些列表,必须创建这些列表。
可能的解决方法:
声明你的Map为Map<String,Set>或Map<String,Collection>,然后插入你的Set。
您可以使用List.addAll()方法。它接受一个集合作为参数,您的集合就是一个集合。
List<String> mainList = new ArrayList<String>();
mainList.addAll(set);
编辑:作为对问题编辑的回应。
很容易看出,如果您想要有一个带有列表作为值的Map,为了有k个不同的值,您需要创建k个不同的列表。
因此:您根本无法避免创建这些列表,必须创建这些列表。
可能的解决方法:
声明你的Map为Map<String,Set>或Map<String,Collection>,然后插入你的Set。
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并不能保证它。如本文所述:
没有对类型、可变性、可序列化性或
返回List的线程安全;如果更多的控制返回
需要清单,使用收集(供应商)。
如果你想确保总是,那么你可以请求一个实例,具体为:
List<String> stringArrayList = setString.stream()
.collect(Collectors.toCollection(ArrayList::new));