2011-11-18 82 views
7

我有一個Java類可以訪問我想從Scala使用的事務上下文。所以我想,我會寫一個Java方法,它接受斯卡拉功能,並調用它的事務中 -斯卡拉中是否有lambda函數?

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

到目前爲止好。我希望能夠將斯卡拉封閉傳遞給它

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

但不能因爲runInTx實際上不是按名稱調用,並且ids foreach { dao.delete(_) }實際上不是Function0。現在

我可以解決這個問題,一個小的thunk

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

,但在我看來,我需要一個lambda函數產生一個無名Function0出一個代碼塊。

在API中是否存在這樣的事情,或者我該如何去寫它?

回答

11

您可以告訴編譯器將該塊解釋爲一個函數,而不是通過添加(在此情況下缺少)參數立即調用的語句。

因此,在這種情況下:

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

() => ids foreach { dao.delete(_) }是函數字面的完整形式。編譯器允許參數列表在可以推斷需要函數的地方被省略 - 這對於按名稱調用是正確的,但在傳遞給採用Function

的方法時似乎並不正確