2

为什么generateEmptyArrayBySize方法接收0作为输入,而不是3?我期待收到列表大小。

public class CollectionToArrayTest {
    public static void main(String[] args) {
        var list = List.of(1, 2, 3);
        var array = list.toArray(CollectionToArrayTest::generateArrayBySize);
        out.println("array: " + Arrays.toString(array)); // array: [1, 2, 3]
    }

    private static Integer[] generateArrayBySize(int arraySize) {
        out.println("arraySize: " + arraySize); // arraySize: 0
        return new Integer[arraySize];
    }
}
4

2 回答 2

3

如果您查看该Collection.toArray方法的实现,您将看到:

return toArray(generator.apply(0));

另一方面IntFunction,您所拥有的实现类似于:

new IntFunction<Integer[]>() {
    @Override
    public Integer[] apply(int arraySize) { // check the parameter here
        return generateArrayBySize(arraySize);
    }
}

因此传递给 的值与传递给 的方法的值generateArrayBySize相同,即。当然,将列表转换为数组的直接方法是:applyIntFunction0

var array = list.toArray(Integer[]::new);
于 2021-01-04T18:02:36.517 回答
0

当你调用Collection#toArray方法时,它的内部参数,即数组大小,是0由于实现:

default <T> T[] toArray(IntFunction<T[]> generator) {
    return toArray(generator.apply(0));
}

但是您可以明确地将其设置为大于实际大小:

public static void main(String[] args) {
    var list = List.of(1, 2, 3);
    var array = list.toArray(q -> {
        System.out.println("arraySize: " + q); // arraySize: 0
        return generateArrayBySize(4);
    });
    System.out.println(Arrays.toString(array)); // [1, 2, 3, null]
}
private static Integer[] generateArrayBySize(int arraySize) {
    System.out.println("arraySize: " + arraySize); // arraySize: 4
    return new Integer[arraySize];
}

另请参阅:将 2d 数组中每一行的空元素移动到该行的末尾

于 2021-02-10T18:20:12.833 回答