Trong Java chúng tôi có thể tạo IntFunction<String[]>
từ 1D constructor mảng tham khảo:Phương pháp tham chiếu đến các mảng đa chiều trong Java 8
// both do the same thing
IntFunction<String[]> createArrayL = size -> new String[size];
IntFunction<String[]> createArrayMR = String[]::new;
Bây giờ tôi tự hỏi tại sao chúng ta không thể làm điều này với một mảng 2D:
BiFunction<Integer, Integer, String[][]> createArray2DL =
(rows, cols) -> new String[rows][cols];
// error:
BiFunction<Integer, Integer, String[][]> createArray2DMR =
String[][]::new;
Tất nhiên chúng tôi có thể viết:
IntFunction<String[][]> createArray2DInvalidL = String[][]::new;
System.out.println(createArray2DInvalidL.apply(3)[0]); // prints null
nhưng điều này sẽ hoạt động khác với:
new String[3][3]
vì mảng hàng sẽ không được khởi tạo.
Vì vậy, câu hỏi của tôi là: tại sao String[][]::new
không hoạt động đối với mảng 2D (đối với tôi có vẻ như sự không nhất quán trong thiết kế ngôn ngữ)?
và tại sao 'BiFunction createArray2DL = (a, b) -> String [] [] :: new;' tạo ra lỗi ?? –
user43968
@ user43968 vì trong biểu thức lambda của bạn, bạn đang trả về hàm khác '' 'BiFunction> createArray2DL = (a, b) -> String [] [] :: new;' '' –