2011-11-18 33 views
7

Tôi có một lớp Java có quyền truy cập vào ngữ cảnh giao dịch mà tôi muốn sử dụng từ Scala. Vì vậy, tôi nghĩ rằng tôi muốn viết một phương pháp Java có chức năng Scala và gọi nó trong giao dịch -Có chức năng lambda nào trong Scala không?

class Context { 
    @Transactional public void runInTx(Function0<scala.Unit> f) { 
     f.apply(); 
    } 

Cho đến nay rất tốt. Tôi muốn để có thể vượt qua một đóng Scala để nó

def deleteItems(ids: Set[Long]) = { 
    context.runInTx { ids foreach { dao.delete(_) } } 
} 

nhưng có thể không phải vì runInTx không thực sự gọi bằng tên, và ids foreach { dao.delete(_) } không phải là thực sự là một Function0.

Bây giờ tôi có thể giải quyết vấn đề này với một thunk nhỏ

def deleteItems(ids: Set[Long]) = { 
    def localApply(f: => Unit) = context.applyInTx(f _) 
    localApply { ids foreach { dao.delete(_) } } 
} 

nhưng có vẻ như với tôi rằng tôi cần một hàm lambda để tạo ra một giấu tên Function0 ra khỏi một khối mã.

Điều đó có tồn tại trong API hay không hoặc làm thế nào để tôi viết nó?

Trả lời

11

Bạn có thể yêu cầu trình biên dịch diễn giải khối dưới dạng hàm thay vì lệnh được gọi ngay lập tức bằng cách thêm tham số (trong trường hợp này thiếu).

Vì vậy, trong trường hợp này:

def deleteItems(ids: Set[Long]) = { 
    context.runInTx {() => ids foreach { dao.delete(_) } } 
} 

() => ids foreach { dao.delete(_) } là hình thức đầy đủ các chức năng theo nghĩa đen. Trình biên dịch cho phép danh sách tham số được bỏ qua ở những nơi mà nó có thể suy ra rằng một hàm được yêu cầu - điều này đúng cho cuộc gọi theo tên, nhưng dường như không đúng khi chuyển sang phương thức lấy Function

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