如何在Java中从Stream的Stream或Iterator的Iterator生成二维数组?
解决Iterator(含Cell迭代器)转二维数组的编译错误
我来帮你排查这段代码的编译问题哈~ 你遇到的错误大概率是泛型类型推断模糊或者数组类型匹配不明确导致的,咱们一步步调整修复:
问题根源
原代码里内层的toArray()没有指定数组生成器,默认返回Object[],但编辑器的类型检查可能无法准确推断出外层流的元素类型就是Object[],从而抛出编译错误。另外,lambda里的显式类型声明((Row row))其实可以省略,让类型推断更顺畅。
修正后的基础版本
// 生成Object[][]类型的二维数组 Object[][] twoDArray = StreamSupport.stream( Spliterators.spliteratorUnknownSize(rowIterator, Spliterator.ORDERED), false ) .map(row -> { Iterator<Cell> cellIterator = row.cellIterator(); return StreamSupport.stream( Spliterators.spliteratorUnknownSize(cellIterator, Spliterator.ORDERED), false ) .map(Utils::genericCellMapper) .toArray(Object[]::new); // 明确指定生成Object[],让类型推断清晰 }) .toArray(Object[][]::new);
进阶优化(指定元素类型)
如果Utils::genericCellMapper返回的是特定类型(比如String、Integer或者自定义类型),咱们可以把数组类型写得更精确,避免不必要的类型转换:
假设genericCellMapper返回String,代码可以改成:
// 生成String[][]类型的二维数组 String[][] stringTwoDArray = StreamSupport.stream( Spliterators.spliteratorUnknownSize(rowIterator, Spliterator.ORDERED), false ) .map(row -> StreamSupport.stream( Spliterators.spliteratorUnknownSize(row.cellIterator(), Spliterator.ORDERED), false ) .map(Utils::genericCellMapper) .toArray(String[]::new) // 生成String[]类型的一维数组 ) .toArray(String[][]::new); // 最终生成String[][]类型的二维数组
更简洁的紧凑写法
如果不需要额外的变量声明,还可以把代码压缩得更简洁:
Object[][] result = StreamSupport.stream(Spliterators.spliteratorUnknownSize(rowIterator, Spliterator.ORDERED), false) .map(row -> StreamSupport.stream(Spliterators.spliteratorUnknownSize(row.cellIterator(), Spliterator.ORDERED), false) .map(Utils::genericCellMapper) .toArray(Object[]::new)) .toArray(Object[][]::new);
内容的提问来源于stack exchange,提问作者Tapas Bose
相关产品推荐
相关产品推荐

