例如,我目前正在做这个:
Set<String> setOfTopicAuthors = ....
List<String> list = Arrays.asList(
setOfTopicAuthors.toArray( new String[0] ) );
你能打败这个吗?
例如,我目前正在做这个:
Set<String> setOfTopicAuthors = ....
List<String> list = Arrays.asList(
setOfTopicAuthors.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<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返回指定列表的不可修改视图,就像每个doc一样。不可修改的视图集合是不可修改的集合,也是备份集合上的视图。注意,对备份集合的更改仍然是可能的,如果发生更改,则通过不可修改的视图可见。但收集者的方法是收集者。unmodifiableList在Java 10中返回真正不可变的列表。
其他回答
如果你正在使用Guava,你静态地从Lists类导入newArrayList方法:
List<String> l = newArrayList(setOfAuthors);
试试Set:
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());
List<String> list = new ArrayList<String>(listOfTopicAuthors);
通过代码的上下文,我不太确定你在做什么,但是……
为什么要让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<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返回指定列表的不可修改视图,就像每个doc一样。不可修改的视图集合是不可修改的集合,也是备份集合上的视图。注意,对备份集合的更改仍然是可能的,如果发生更改,则通过不可修改的视图可见。但收集者的方法是收集者。unmodifiableList在Java 10中返回真正不可变的列表。