209

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

Set<String> setOfTopicAuthors = ....

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

你能打败这个吗?

4

6 回答 6

446
List<String> list = new ArrayList<String>(listOfTopicAuthors);
于 2010-02-23T15:56:06.867 回答
94
List<String> l = new ArrayList<String>(listOfTopicAuthors);
于 2010-02-23T15:56:23.387 回答
25

考虑到我们有Set<String> stringSet我们可以使用以下内容:

纯Java

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

番石榴

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

阿帕奇公地

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

Java 10(不可修改列表)

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

Java 8(可修改列表)

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

根据该方法的文档toList()

不保证返回的 List 的类型、可变性、可序列化性或线程安全性;如果需要对返回的列表进行更多控制,请使用 toCollection(Supplier)。

因此,如果我们需要一个特定的实现,例如ArrayList,我们可以通过以下方式获得它:

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

Java 8(不可修改的列表)

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

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返回指定列表的不可修改视图。不可修改的视图集合是不可修改的集合,也是支持集合的视图。请注意,对支持集合的更改可能仍然是可能的,并且如果发生更改,它们将通过不可修改的视图可见。但是收集器方法在Java 10Collectors.unmodifiableList中返回真正不可变的列表。

于 2015-08-24T10:04:50.013 回答
14

试试这个Set

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

试试这个Map

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());
于 2013-05-22T10:47:43.273 回答
2

如果您使用 Guava,则从Lists类中静态导入newArrayList方法:

List<String> l = newArrayList(setOfAuthors);
于 2014-02-07T20:14:19.743 回答
0

不太确定您通过代码的上下文到底在做什么,但是......

为什么要制作listOfTopicAuthors变量?

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

“....” 代表您的套装开始发挥作用,无论它是新的还是来自其他位置。

于 2015-07-16T19:25:55.320 回答