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

我希望避免在循环的每次迭代中创建一个新列表。这可能吗?


当前回答

最简单的解决方案

我想要一种非常快速的方法将我的set转换为List并返回它,所以在一行中我做到了

 return new ArrayList<Long>(mySetVariable);

其他回答

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

我会这样做:

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

最简单的解决方案

我想要一种非常快速的方法将我的set转换为List并返回它,所以在一行中我做到了

 return new ArrayList<Long>(mySetVariable);

我们可以在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());
}

由于到目前为止还没有提到它,从Java 10开始,你可以使用新的copyOf工厂方法:

List.copyOf(set);

来自Javadoc:

按迭代顺序返回一个不可修改的List,其中包含给定Collection的元素。

注意,这将在底层创建一个新的列表(确切地说是ImmutableCollections$ListN)

在给定集合上调用Collection#toArray(),然后 将这些对象放入一个新数组中。