2011-11-18 8 views
7

私はScalaから使用したいトランザクションコンテキストにアクセスできるJavaクラスを持っています。だから私は、Scala関数を使ってトランザクション内で呼び出しているJavaメソッドを書くと思っていました。 -Scalaにラムダ関数はありますか?

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

これまでのところとても良いです。私はそれ

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

にScalaのクロージャを渡すことができるようにしたいと思いますがrunInTxは実際には名前で呼んでされていないことができないため、とids foreach { dao.delete(_) }は実際にFunction0ではありません。

今、私は小さなサンク

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

で、この問題を解決することができますが、私は、コードブロックのうち、無名のFunction0を生成するためにラムダ関数を必要とするように私には思えます。

APIにこのようなことが存在するのですか、それを書くにはどうすればいいですか?

答えて

11

コンパイラに、(この場合は欠落している)パラメータを追加することで、すぐに呼び出される文ではなく、関数としてブロックを解釈するようにコンパイラに指示できます。したがって、この場合の

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

() => ids foreach { dao.delete(_) }は関数リテラルの完全な形です。コンパイラは、関数が必要であると推測できる場所ではパラメータリストを省略することができます。これは名前による呼び出しには当てはまりますが、メソッドに渡すときには当てはまりません。Function

関連する問題