将嵌套列表转换为2d数组

我正在尝试将嵌套列表转换为二维数组。

List<List> list = new ArrayList(); list.add(Arrays.asList("a", "b", "c")); list.add(Arrays.asList("dd")); list.add(Arrays.asList("eee", "fff")); 

我想把它变成一个String[][] 。 我尝试过以下方法:

 String[][] array = (String[][]) list.toArray(); // ClassCastException String[][] array = list.toArray(new String[3][3]); // ArrayStoreException String[][] array = (String[][]) list.stream() // ClassCastException .map(sublist -> (String[]) sublist.toArray()).toArray(); 

有办法吗? 请注意,我不会知道列表的大小,直到运行时,它可能是锯齿状的。

没有简单的内置方法可以执行您想要的操作,因为您的toArray只能返回存储在列表中的元素数组,在您的情况下也可以是列表。

最简单的解决方案是创建二维数组并使用每个嵌套列表中的toArray结果填充它。

 String[][] array = new String[list.size()][]; int i = 0; for (List nestedList : list) { array[i++] = nestedList.toArray(new String[nestedList.size()]); } 

(如果你像使用Alex一样使用带有流的Java 8,你可以缩短这段代码)

你可以这样做:

 String[][] array = list.stream() .map(l -> l.stream().toArray(String[]::new)) .toArray(String[][]::new); 

它从列表列表中创建一个Stream> ,然后从那里使用map用一个字符串数组替换每个列表,这些字符串导致一个Stream ,然后最终调用toArray (带有一个生成String[][]生成器函数,而不是无参数版本)。

比亚历克斯的回答略显简短:

 final List> list = ...; final String[][] array = list.stream().map(List::toArray).toArray(String[][]::new);