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

12

为了实现互操作性,我需要从Java代码中传递一个Scala PartialFunction。对于Function(Function1等),我可以使用AbstractFunction进行子类化,并使用匿名类型,但是如何在PartialFunction上执行相同的操作呢?

在这种情况下,我希望它在Java中成为一个“完整”的函数,对所有值都定义,但类型为PartialFunction。

3个回答

9

我会在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);
}

然后,在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库中使用一个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) { /* */ }
}

这涉及到一些间接层次!

我考虑在Scala中创建一些包装器/工厂。然而,对于这个项目,我无法自己编写任何Scala代码。 - SoftMemes

6

你有没有任何关于Akka for Scala 2.10发布时间的想法?谢谢。 - SoftMemes
大约在 Scala 2.10 发布时。 - Viktor Klang
Twitter声称AbstractPartialFunction不适用于Java互操作性,应该使用他们的com.twitter.util.Function。但是他们的推理非常模糊... - kaqqao

6

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接