对于互操作性,我需要从Java代码中传递Scala PartialFunction。对于函数(function1等),有抽象功能可以用匿名类型子类,但是对于PartialFunction来说,最简单的方法是什么? 在这种情况下,我很高兴在Java中拥有“完整”函数,为所有值定义,但键入为PartialFunction。

有帮助吗?

解决方案

如果可以使用Twitter Util库,它专门为此类: http://twitter.github.com/util/util-core/target/site/doc/main/api/com/twitter/util/function。html ,它基本上是与抽象术功能相同的解决方案。

其他提示

我将在这里做的是在java中提供一个接口,在一些公共库中(不是Scala-Aware):

//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库),将此实现转换为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库中的 ,a 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,几个间接级别!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top