java8 stream toArray вопрос — Почему мне не нужно указывать размер массива здесь для int[][]::new ?

#java #java-stream

#java #java-stream

Вопрос:

Используя приведенный ниже код, я мог бы скопировать 2-мерный массив, но почему мне не нужно указывать размер массива здесь для int[][]::new ?

 int[][]source= {{0, 1, 0}, {0, 0, 1}, {1, 1, 1}, {0, 0, 0},{0, 0, 0}};

int[][] destination=Arrays.stream(source)
                    .map(a ->  Arrays.copyOf(a, a.length))
                    .toArray(int[][]::new);
 

Комментарии:

1. когда вы возвращаете массив из функции, вам также не нужно указывать размер

Ответ №1:

Потому что то, что вы предоставляете, — это не массив, а ссылка на метод построения массива. toArray Реализация предоставит размер для вызова конструктора.

Комментарии:

1. Реализация toArray предоставит только одно значение параметра, но здесь вам нужно два значения для 2-мерного массива.

2. @stewchicken: нет, потому что к тому времени внутренние массивы уже будут созданы. Подумайте о int[][] созданном с использованием этого параметра просто 1-мерном массиве, где тип элемента оказывается другим 1-мерным массивом int[] . По сути, эта строка будет эффективно выполнять эквивалент new int[someSize][] .

3. Ареус и Иоахим, спасибо за ваше краткое объяснение!