對於互操作性,我需要從Java代碼傳遞一個Scala PartialFunction。對於函數(Function1等),我可以使用匿名類型繼承AbstractFunction,但對PartialFunction執行相同操作最簡單的方法是什麼?在Java中實現Scala PartialFunction的最簡單方法是什麼?
在這種情況下,我很樂意讓它成爲Java中的一個「完整」函數,顯示爲所有值定義,但鍵入爲PartialFunction。
對於互操作性,我需要從Java代碼傳遞一個Scala PartialFunction。對於函數(Function1等),我可以使用匿名類型繼承AbstractFunction,但對PartialFunction執行相同操作最簡單的方法是什麼?在Java中實現Scala PartialFunction的最簡單方法是什麼?
在這種情況下,我很樂意讓它成爲Java中的一個「完整」函數,顯示爲所有值定義,但鍵入爲PartialFunction。
如果你可以使用Twitter的Util庫,它有一類專門爲此:http://twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/Function.html這基本上是相同的解決方案AbstractPartialFunction 。
我會在這裏做的是提供的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,幾個層面的間接!
爲補充克里斯的回答,在斯卡拉2.10你可以使用這個:http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/runtime/AbstractPartialFunction.html
謝謝。當Akka for Scala 2.10發佈時有什麼想法? – SoftMemes
在Scala 2.10發佈的某個時候。 –
我曾考慮在Scala中創建一些包裝器/工廠。但是,對於這個項目,我無法在Scala中自己生成任何代碼。 – SoftMemes