2014-10-20 35 views
6

Tôi đã có Giao diện Java này chỉ với một phương thức.Tương đương Groovy cho Java 8 Biểu thức Lambda

// Java Interface 
public interface AuditorAware { 
    Auditor getCurrentAuditor(); 
} 

Tôi đã sử dụng biểu thức Lambda Java 8 để tạo ra độ bóng của AuditorAware như sau.

// Java 8 Lambda to create instance of AuditorAware 
public AuditorAware currentAuditor() { 
    return() -> AuditorContextHolder.getAuditor(); 
} 

Tôi đang cố gắng viết trên thực hiện Java trong Groovy.

Tôi thấy có rất nhiều cách để triển khai giao diện trong groovy như được hiển thị trong tài liệu Groovy ways to implement interfaces này.

Tôi đã triển khai bên trên mã Java để tương đương bằng cách sử dụng giao diện triển khai thực hiện với bản đồ như được hiển thị trong tài liệu được đề cập ở trên.

// Groovy Equivalent by "implement interfaces with a map" method 
AuditorAware currentAuditor() { 
    [getCurrentAuditor: AuditorContextHolder.auditor] as AuditorAware 
} 

Nhưng triển khai giao diện bằng phương pháp đóng dường như ngắn gọn hơn như trong ví dụ tài liệu. Tuy nhiên, khi tôi cố thực hiện như sau, IntelliJ hiển thị các lỗi cho biết Khối mã không rõ ràng.

// Groovy Equivalent by "implement interfaces with a closure" method ??? 
AuditorAware currentAuditor() { 
    {AuditorContextHolder.auditor} as AuditorAware 
} 

Làm cách nào để thay đổi triển khai Java 8 lambda thành tương đương bằng cách sử dụng phương pháp "triển khai giao diện với đóng"?

+2

có bạn đã cố gắng xác định việc đóng cửa mà không rời khỏi -> out? {-> AuditorContextHolder.auditor} cũng không cần thiết nếu bạn đang sử dụng Groovy 2.2+ –

+0

@DylanBijnagte Cảm ơn. Điều đó hiệu quả. Ngoài ra, tôi đang sử dụng 'groovy 2.3.6'. – TheKojuEffect

Trả lời

4

Được nhận xét bởi Dylan Bijnagte, mã sau đã hoạt động.

// Groovy Equivalent by "implement interfaces with a closure" method 
AuditorAware currentAuditor() { 
    { -> AuditorContextHolder.auditor} as AuditorAware 
} 

Mục paramter Ghi chú của Documentation on Groovy Closure giải thích điều này.

3

Bạn có thể sử dụng toán tử .& để có được một tài liệu tham khảo phương pháp:

class Auditor { 
    String name 
} 

interface AuditorAware { 
    Auditor getCurrentAuditor() 
} 

class AuditorContextHolder { 
    static getAuditor() { new Auditor(name: "joe") } 
} 

AuditorAware currentAuditor() { 
    AuditorContextHolder.&getAuditor 
} 

assert currentAuditor().currentAuditor.name == "joe" 

Trong Java 8 bạn có thể sử dụng :: để tham khảo phương pháp:

AuditorAware currentAuditor() { 
    return AuditorContextHolder::getAuditor; 
    } 
+0

Cảm ơn bạn. Phương pháp tham chiếu cũng rất tuyệt. – TheKojuEffect

Các vấn đề liên quan