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

csh*_*olk 8 java lambda language-lawyer java-8 method-reference

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

    // both do the same thing
    IntFunction<String[]> createArrayL = size -> new String[size];
    IntFunction<String[]> createArrayMR = String[]::new;
Run Code Online (Sandbox Code Playgroud)

现在我想知道为什么我们不能用2D数组做到这一点:

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

    // error:
    BiFunction<Integer, Integer, String[][]> createArray2DMR =
            String[][]::new;
Run Code Online (Sandbox Code Playgroud)

我们当然可以写:

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

但这将表现得与以下不同:

    new String[3][3]
Run Code Online (Sandbox Code Playgroud)

因为行数组不会被初始化.

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

Grz*_*rek 8

确实是一个非常有趣的案例.

问题是这String[][]::new是一个arity为1的函数(它是数组数组的构造函数),并且不能被视为BiFunction(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/

  • 为什么`BiFunction <Integer,Integer,String [] []> createArray2DL =(a,b) - > String [] [] :: new;`产生错误? (2认同)