Sof*_*mes 12 java scala partialfunction
为了实现互操作性,我需要从Java代码传递Scala PartialFunction.对于Function(Function1等),我可以使用匿名类型对AbstractFunction进行子类化,但对PartialFunction执行相同操作的最简单方法是什么?
在这种情况下,我很乐意将它作为Java中的"完整"函数,出现为所有值定义,但键入为PartialFunction.
我在这里要做的是在Java中提供一个接口,在一些公共库中(不支持scala):
//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);
}
Run Code Online (Sandbox Code Playgroud)
然后,在scala(即依赖于上述Java库的scala库)中,将此实现转换为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
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后你的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) { /* */ }
}
Run Code Online (Sandbox Code Playgroud)
如果您不喜欢这种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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后您的呼叫网站如下所示:
//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) { /* */ }
}
Run Code Online (Sandbox Code Playgroud)
这涉及到一些间接的等级!
作为Chris答案的补充,在Scala 2.10中你可以使用:http://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/runtime/AbstractPartialFunction.html
如果您可以使用Twitter Util库,它有一个专门用于此类的类:http://twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/Function. html与AbstractPartialFunction基本相同的解决方案.