2012-01-18 12 views
5

Tôi đã đọc http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html và nhận thấy rằng tất cả các ví dụ có loại đối số được khai báo một cách rõ ràng, mặc dù nó đã được biết đến từ khai báo chức năng giao diện.Có bất kỳ lý do nào để xác định loại đối số được yêu cầu trong cú pháp lambda Java 8 không?

public interface FileFilter { 
    /** ... **/ 
    boolean accept(File pathname); 
} 


FileFilter java = (File f) -> f.getName().endsWith(".java"); 

chúng tôi không thể đi với chỉ

(f) -> f.getName().endsWith(".java"); ? 

CẬP NHẬT: Trong JSR-335 Draft, tôi đã tìm thấy rằng các thông số suy ra kiểu có thể sẽ được hỗ trợ

(int x) -> x+1 // Single declared-type parameter 
(int x) -> { return x+1; } // Single declared-type parameter 
(x) -> x+1 // Single inferred-type parameter 
x -> x+1 // Parens optional for single inferred-type case 
+1

Lý do mà hầu hết các ví dụ sử dụng các loại tham số biểu hiện, mặc dù suy luận kiểu được xem xét từ ngày 1, hoàn toàn là sư phạm. Khán giả được cho là các nhà phát triển Java thông thường, những người chưa từng thấy bất kỳ tài liệu nào trước đây; ném lambdas * và * loại suy luận vào họ trong một đi sẽ có được rất nhiều để tham gia. –

Trả lời

3

Có một ví dụ trong đó loại được bỏ qua trong "4. Target gõ" phần

Comparator<String> c = (s1, s2) -> s1.compareToIgnoreCase(s2); 
0

nhất Tôi tưởng tượng nó phụ thuộc vào việc nó biết muộn đến mức nào.

Trong Java 7, mã ở bên phải của = không biết cách sử dụng biểu thức. Chỉ cần để có được điều này để biên dịch đòi hỏi một sự thay đổi thiết kế cho trình biên dịch.

Về lý thuyết, bạn thậm chí không cần khai báo biến vì nó được chỉ định trong phụ huynh hoặc có thể được ngụ ý.

FileFilter java = (File f) -> f.getName().endsWith(".java"); 

có thể

FileFilter java = -> pathname.getName().endsWith(".java"); 

hoặc với một getter ngụ ý.

FileFilter java = -> pathname.name.endsWith(".java"); 

hoặc bạn có thể giả định tham số được nhập hoàn toàn vào không gian tên vì chỉ có một tham số. (Giống như SQL thực hiện với tên cột)

FileFilter java = -> name.endsWith(".java"); 
Các vấn đề liên quan