2012-05-18 151 views
11

對於互操作性,我需要從Java代碼傳遞一個Scala PartialFunction。對於函數(Function1等),我可以使用匿名類型繼承AbstractFunction,但對PartialFunction執行相同操作最簡單的方法是什麼?在Java中實現Scala PartialFunction的最簡單方法是什麼?

在這種情況下,我很樂意讓它成爲Java中的一個「完整」函數,顯示爲所有值定義,但鍵入爲PartialFunction。

回答

9

我會在這裏做的是提供的Java接口,在一些公共庫(這是不是斯卡拉感知):

//this is Java - in the Java lib 
abstract class PartialTransformer<I, O> { 
    abstract public boolean isDefinedAt(I i); 
    public O transform(I i) { 
     if (isDefinedAt(i)) { 
      return transform0(i); 
     } 
     return null; 
    } 
    abstract protected O transform0(I i); 
} 

然後,在斯卡拉(即Scala庫依賴於上面的Java庫),轉換這樣的一個實施一個PartialFunction

//this is scala - in the scala lib 
object MyPartialFunctions { 
    def fromPartialTransformer[I, O](t: PartialTransformer[I, O]) = new PartialFunction[I, O] { 
    def isDefinedAt(i: I) = t isDefinedAt i 
    def apply(i: I) = { 
     val r = t transform i 
     if (r eq null) throw new MatchError 
     else r 
    } 
    } 
} 

然後你的Java代碼可以做到這一點:

//This is Java - in your client code 
MyPartialFunctions$.MODULE$.fromPartialTransformer(new PartialTransformer<Integer, String>() { 
    @Override public boolean isDefinedAt(Integer i) { /* */ } 
    @Override protected String transform0(Integer i) { /* */ } 
} 

如果你不喜歡MyPartialFunctions$.MODULE$語法,它可能在Scala庫,一個Java類其中隱藏了從您:

//This is Java - in the scala-lib 
public class ScalaUtils { 
    public <I, O> scala.PartialFunction<I, O> toPartialFunction(PartialTransformer<I, O> t) { 
     MyPartialFunctions$.MODULE$.fromPartialTransformer(t); 
    } 
} 

然後你的電話,網站看起來是這樣的:

//This is Java - in your client code 
ScalaUtils.toPartialFunction(new PartialTransformer<Integer, String>() { 
    @Override public boolean isDefinedAt(Integer i) { /* */ } 
    @Override protected String transform0(Integer i) { /* */ } 
} 

這涉及到,ahem,幾個層面的間接!

+0

我曾考慮在Scala中創建一些包裝器/工廠。但是,對於這個項目,我無法在Scala中自己生成任何代碼。 – SoftMemes

相關問題