我需要得到一个字符串[]从一个集<字符串>,但我不知道如何做到这一点。以下操作失败:

Map<String, ?> myMap = gpxlist.getAll();
Set<String> myset = myMap.keySet();
String[] GPXFILES1 = (String[]) myset.toArray(); // Here it fails.

我怎样才能让它正常工作呢?


当前回答

Set<String> stringSet= new HashSet<>();
String[] s = (String[])stringSet.toArray();

其他回答

在Java 11中,我们可以使用Collection.toArray(生成器)方法。下面的代码将创建一个String的新数组:

Set<String> set = Set.of("one", "two", "three");
String[] array = set.toArray(String[]::new)

见:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Collection.html toArray (java.util.function.IntFunction)

Java 11

Collection接口中新的默认toArray方法允许将集合的元素转移到新创建的所需运行时类型的数组中。它以IntFunction<T[]>生成器作为参数,可用于:

 String[] array = set.toArray(String[]::new);

已经有一个类似的方法Collection.toArray(T[]),这个添加意味着我们不再能够将null作为参数传递,因为在这种情况下,对该方法的引用将是模糊的。但这仍然是可以的,因为这两种方法都会抛出NPE。

Java 8

在Java 8中,我们可以使用streams API:

String[] array = set.stream().toArray(String[]::new);

我们还可以使用重载版本的toArray(),它将IntFunction<A[]>生成器作为:

String[] array = set.stream().toArray(n -> new String[n]);

这里generator函数的目的是获取一个整数(所需数组的大小)并生成所需大小的数组。我个人更喜欢使用方法引用的前一种方法,而不是使用lambda表达式的后一种方法。

Set<String> stringSet= new HashSet<>();
String[] s = (String[])stringSet.toArray();

番石榴风格:

Set<String> myset = myMap.keySet();
FluentIterable.from(mySet).toArray(String.class);

更多信息:https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/FluentIterable.html

使用toArray(T[] a)方法:

String[] array = set.toArray(new String[0]);