如何将Collection <set <string >>转换为字符串数组

时间:2018-12-07 10:20:17

标签: java

当我尝试进行转换时,我遇到了异常

java.lang.ArrayStoreException: java.util.HashSet
        at java.util.AbstractCollection.toArray(Unknown Source)

这是我的代码

Map<String, Set<String>> map = new HashMap<>();
String[] keySet = map.keySet().toArray(new String[map.size()]);
Collection<Set<String>> collections = map.values();
String[] values = collection.toArray(new String[collection.size()]);// In this line getting Exception

2 个答案:

答案 0 :(得分:2)

您无法执行的操作。在文档中对此进行了明确说明。

toArray方法被记录为抛出java.lang.ArrayStoreException

  

如果指定数组的运行时类型不是该数组的超类型   该集合中每个元素的运行时类型

相反,您可以做的是根据地图值flatMap创建一个流! (即折叠嵌套序列),然后收集到一个数组中:

 map.values()  // Collection<Set<String>>
    .stream()  // Stream<Set<String>>
    .flatMap(Collection::stream) // Stream<String>
    .toArray(String[]::new); // String[]

答案 1 :(得分:1)

values上流式传输时,您可以简单地使用Stream.flatMap以便稍后将它们收集到数组中。可以这样做:

String[] values = map.values().stream()
                  .flatMap(Collection::stream)
                  .toArray(String[]::new);

注意 :即使使用

,代码也能成功编译的原因
toArray(new String[collection.size()])

Collection.toArray(T[] a),因为编译器很难在执行通用类型之前确定类型。这就是为什么

Integer[] values = collections.toArray(new Integer[collections.size()]);

将根据您的情况进行编译,但是现在您可以清楚地看到,集合中的任何地方都没有Integer类型。因此,在 runtime 处,将使用指定数组的运行时类型和此集合的大小为分配一个新数组。

因为您的集合的类型为ArrayStoreException而不是Set<String>,所以您的情况下String就是从那里产生类型不匹配的。

重要 :您可能无法像进一步想像的那样convert to a generic array