2011-11-18 3 views
7

Scala에서 사용하려는 트랜잭션 컨텍스트에 대한 액세스 권한이있는 Java 클래스가 있습니다. 그래서 나는 스칼라 함수를 사용하여 트랜잭션 내에서 호출하는 Java 메소드를 작성한다고 생각했습니다. -스칼라에 람다 함수가 있습니까?

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 없습니다.

지금은 작은 썽크

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(_) } 리터럴 기능의 전체 형태입니다. 컴파일러는 함수가 필요하다는 것을 추론 할 수있는 곳에서는 매개 변수 목록을 생략 할 수 있습니다. 이것은 이름으로 호출 할 때 true이지만, Function