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

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

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


当前回答

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表达式的后一种方法。

其他回答

我也面临着同样的情况。

我首先声明我需要的结构:

设置<String> myKeysInSet = null; String[] myArrayOfString = null;

在我的例子中,我有一个JSON对象,我需要这个JSON中的所有键存储在字符串数组中。使用GSON库,我使用JSON.keySet()来获取键并移动到我的Set:

myKeysInSet = json_any.keySet();

这样,我就有了一个包含所有键的Set结构,因为我需要它。我只需要把值放到字符串数组中。请看下面的代码:

myArrayOfString = myKeysInSet.toArray(new String[myKeysInSet.size()]);

这是我在StackOverflow的第一个答案。 很抱歉有任何错误:D

番石榴风格:

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

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

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表达式的后一种方法。

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

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