Tôi đã tìm thấy một ví dụ thú vị khi sử dụng API Stream:
Stream stream = Stream.of("w", "o", "l", "f");
BiConsumer nối thêm = StringBuilder::append;
StringBuilder đã thu thập =stream.collect(StringBuilder::new,append, StringBuilder::append);
System.out.println(đã thu thập); //nó hoạt động chính xác
Stream.collect có ba tham số:
Nhà cung cấp nhà cung cấp, bộ tích lũy BiConsumer, bộ kết hợp BiConsumer
BiConsumer nhận hai tham số và không trả về gì. Tại sao dòng này biên dịch và chạy?
BiConsumer nối thêm = StringBuilder::append;
StringBuilder không có phương thức void nối thêm (java.lang.StringBuilder, java.lang.String).
JLS 15.13.3Một bộ thu được chỉ định ít nhiều (đối tượng mà phương thức đang được gọi) có thể là tham số đầu tiên của giao diện chức năng:
Nếu biểu mẫu là ReferenceType :: [TypeArguments] Identifier thì phần thân của phương thức gọi tương tự có tác dụng của một biểu thức gọi phương thức cho một khai báo thời gian biên dịch là khai báo thời gian biên dịch của biểu thức tham chiếu phương thức. của biểu thức gọi phương thức được quy định trong §15.12.4.3, §15.12.4.4 và §15.12.4.5, trong đó:
Chế độ gọi được bắt nguồn từ khai báo thời gian biên dịch như được chỉ định trong §15.12.3.
Nếu khai báo tại thời điểm biên dịch là một phương thức phiên bản thì tham chiếu đích là tham số chính thức đầu tiên của phương thức gọi.
Nếu khai báo tại thời điểm biên dịch là một phương thức phiên bản thì các đối số cho biểu thức gọi phương thức (nếu có) là các tham số chính thức thứ hai và tiếp theo của phương thức gọi đó. phương pháp triệu tập.
Khai báo tại thời điểm biên dịch thực sự là một phương thức cá thể, vì vậyStringBuilder
Trở thành tham số đầu tiên của phương thức gọi,String
trở thành tham số thứ hai.
Nói cách khác, tham chiếu phương thức SomeClass::instancePhương thức
Tương đương với lambda (SomeClass nhận, args...) ->receiver.instanceMethod(args...)
.
Tôi là một lập trình viên xuất sắc, rất giỏi!