最简洁的方法转换Set<T>to a List<

例如,我目前正在做这个:

Set<String> setOfTopicAuthors = ....


List<String> list = Arrays.asList(
setOfTopicAuthors.toArray( new String[0] ) );

你能打败这个吗?

223200 次浏览
List<String> list = new ArrayList<String>(listOfTopicAuthors);
List<String> l = new ArrayList<String>(listOfTopicAuthors);

试试:

Set<String> listOfTopicAuthors = .....
List<String> setList = new ArrayList<String>(listOfTopicAuthors);

试试地图:

Map<String, String> listOfTopicAuthors = .....
// List of values:
List<String> mapValueList = new ArrayList<String>(listOfTopicAuthors.values());
// List of keys:
List<String> mapKeyList = new ArrayList<String>(listOfTopicAuthors.KeySet());

如果你正在使用Guava,你静态地从列表类导入newArrayList方法:

List<String> l = newArrayList(setOfAuthors);

通过代码的上下文,我不太确定你在做什么,但是……

为什么要创建listOfTopicAuthors变量呢?

List<String> list = Arrays.asList((....).toArray( new String[0] ) );

“....”代表你的套装是如何开始的,无论是新的还是来自其他地方。

考虑到我们有Set<String> stringSet,我们可以使用以下方法:

普通的Java

List<String> strList = new ArrayList<>(stringSet);

番石榴

List<String> strList = Lists.newArrayList(stringSet);

Apache Commons

List<String> strList = new ArrayList<>();
CollectionUtils.addAll(strList, stringSet);

java10(不可修改列表)

List<String> strList = List.copyOf(stringSet);
List<String> strList = stringSet.stream().collect(Collectors.toUnmodifiableList());

java8(可修改列表)

import static java.util.stream.Collectors.*;
List<String> stringList1 = stringSet.stream().collect(toList());

根据toList()方法的医生

对于类型、可变性、可序列化性或 返回List的线程安全;如果更多的控制返回 List是必需的,使用toCollection(Supplier).

因此,如果我们需要一个特定的实现,例如ArrayList,我们可以这样得到它:

List<String> stringList2 = stringSet.stream().
collect(toCollection(ArrayList::new));

Java 8(不可修改列表)

我们可以使用Collections::unmodifiableList方法并包装前面示例中返回的列表。我们也可以编写自己的自定义方法:

class ImmutableCollector {
public static <T> Collector<T, List<T>, List<T>> toImmutableList(Supplier<List<T>> supplier) {
return Collector.of( supplier, List::add, (left, right) -> {
left.addAll(right);
return left;
}, Collections::unmodifiableList);
}
}

然后把它用作:

List<String> stringList3 = stringSet.stream()
.collect(ImmutableCollector.toImmutableList(ArrayList::new));

另一种可能性是使用collectingAndThen方法,该方法允许在返回结果之前完成一些最终转换:

    List<String> stringList4 = stringSet.stream().collect(collectingAndThen(
toCollection(ArrayList::new),Collections::unmodifiableList));

一个注意事项是方法Collections::unmodifiableList返回指定列表的不可修改视图,如医生所示。不可修改的视图集合是不可修改的集合,也是备份集合上的视图。注意,对备份集合的更改仍然是可能的,如果发生更改,则通过不可修改的视图可见。但是收集器方法Collectors.unmodifiableList返回Java 10中真正不可变的列表。