12

为了互操作性,我需要从 Java 代码中传递一个 Scala PartialFunction。对于函数(Function1 等),有一个 AbstractFunction,我可以使用匿名类型进行子类化,但对 PartialFunction 执行相同操作的最简单方法是什么?

在这种情况下,我很乐意让它成为 Java 中的“完整”函数,为所有值定义,但类型为 PartialFunction。

4

3 回答 3

9

我在这里要做的是在一些通用库(不支持scala)中提供一个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 库的 scala 库)中,将 this 的实现转换为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 library 中使用,这是一个对您隐藏的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) { /* */ }
}

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

于 2012-05-18T10:43:00.483 回答
6

作为对克里斯的回答的补充,在 Scala 2.10 中,您可以使用它:http ://www.scala-lang.org/archives/downloads/distrib/files/nightly/docs/library/scala/runtime/AbstractPartialFunction.html

于 2012-05-18T10:52:04.963 回答
6

如果您可以使用 Twitter Util 库,它有一个专门用于此的类:http: //twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/Function。 html这与 AbstractPartialFunction 的解决方案基本相同。

于 2012-05-18T13:35:38.517 回答