在Java中实现Scala PartialFunction的最简单方法是什么?

为了实现互操作性,我需要从Java代码传递Scala PartialFunction。 对于Function(Function1等),我可以使用匿名类型对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中提供一个接口,在一些公共库中(不支持scala):

//this is Java - in the Java lib abstract class PartialTransformer { 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库的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 } } } 

然后你的Java代码可以这样做:

 //This is Java - in your client code MyPartialFunctions$.MODULE$.fromPartialTransformer(new PartialTransformer() { @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  scala.PartialFunction toPartialFunction(PartialTransformer t) { MyPartialFunctions$.MODULE$.fromPartialTransformer(t); } } 

然后您的呼叫网站如下所示:

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

这涉及到嗯,几个层次的间接!

作为Chris答案的补充,在Scala 2.10中你可以使用: http : //www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/runtime/AbstractPartialFunction.html