对于互操作性,我需要从Java代码传递斯卡拉PartialFunction。 对于功能(功能1等),有AbstractFunction,我可以匿名类型继承,但什么是做同样的PartialFunction的最简单的方法?
在这种情况下,我会很高兴有它是Java中的一个“完整”的功能,对出现的所有值定义,但类型为PartialFunction。
对于互操作性,我需要从Java代码传递斯卡拉PartialFunction。 对于功能(功能1等),有AbstractFunction,我可以匿名类型继承,但什么是做同样的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) { /* */ }
}
这包括,啊哈,间接的几级!
作为补充,克里斯的回答,在斯卡拉2.10您可以使用此: http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/runtime/AbstractPartialFunction.html