有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

lambda方法引用Java 8中的多维数组

在Java中,我们可以从1D数组构造函数引用中创建IntFunction<String[]>

    // both do the same thing
    IntFunction<String[]> createArrayL = size -> new String[size];
    IntFunction<String[]> createArrayMR = String[]::new;

现在我想知道为什么我们不能用2D阵列来实现这一点:

    BiFunction<Integer, Integer, String[][]> createArray2DL = 
            (rows, cols) -> new String[rows][cols];

    // error:
    BiFunction<Integer, Integer, String[][]> createArray2DMR =
            String[][]::new;

我们当然可以写:

    IntFunction<String[][]> createArray2DInvalidL = String[][]::new;
    System.out.println(createArray2DInvalidL.apply(3)[0]); // prints null

但这将不同于:

    new String[3][3]

因为行数组不会被初始化

所以我的问题是:为什么String[][]::new不适用于2D数组(对我来说,这看起来像是语言设计中的不一致)


共 (1) 个答案

  1. # 1 楼答案

    这的确是一个很有趣的案例

    问题是String[][]::new是一个具有1的arity的函数(它是数组的构造函数),不能被视为双函数(arity为2),并且您的示例new String[3][3]有两个参数,而不是一个参数

    在这种情况下, createArray2DInvalidL.apply(3) 等于调用new String[3][];

    你可能想要的是:

    IntFunction<String[][]> createArray2D = n -> new String[n][n];

    维度不需要有相等的长度,这听起来是一个非常合理的假设

    http://4comprehension.com/multidimensional-arrays-vs-method-references/