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

标签 java scala partialfunction

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

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

最佳答案

我在这里要做的是在一些公共(public)库(不支持 scala)中提供一个 Java 接口(interface):

//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) { /* */ }
}

咳咳,这涉及到几个间接级别!

关于java - 在 Java 中实现 Scala PartialFunction 的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10650338/

相关文章:

java - JComponent contains 方法在 JTable 的 MouseEvent 操作中不起作用

java - 计算 10 以下的数字并打印每一个

java - 按钮不起作用。通过文本字段输入数据

scala - 使用字符串列表作为参数的 Files.write 在 Scala REPL 中失败 (2.10.5)

scala - 高手必须从yarn,spark开始

scala - 在函数式编程术语中,您将 orElse 或其他回退方法称为什么?

Scala 使用 () 应用 PartialFunction 与 .apply() 不同

bluetooth - 如何开始蓝牙配对过程?

来自具体函数的 Scala 偏函数

scala - 触发编译中未执行编译之前的 SBT 任务