从Java使用Scala:将函数作为参数传递

2022-08-31 21:28:35

请考虑以下 Scala 代码:

package scala_java
object MyScala {
  def setFunc(func: Int => String) {
    func(10)
  }
}

现在在Java中,我本来想使用:MyScala

package scala_java;
public class MyJava {
    public static void main(String [] args) {
        MyScala.setFunc(myFunc);  // This line gives an error
    }
    public static String myFunc(int someInt) {
        return String.valueOf(someInt);
    }
}

但是,上述方法不起作用(正如预期的那样,因为Java不允许函数式编程)。在 Java 中传递函数的最简单解决方法是什么?我想要一个通用解决方案,适用于具有任意数量参数的函数。

编辑:Java 8的语法是否比下面讨论的经典解决方案更好?


答案 1

在包中,有用于其他 arities 的命名等抽象类。要从Java使用它们,您只需要覆盖,如下所示:scala.runtimeAbstractFunction1apply

Function1<Integer, String> f = new AbstractFunction1<Integer, String>() {
    public String apply(Integer someInt) {
        return myFunc(someInt);
    }
};

如果您使用的是 Java 8,并且想要为此使用 Java 8 lambda 语法,请查看 https://github.com/scala/scala-java8-compat


答案 2

您必须在 Java 中手动实例化 。像这样:Function1

final Function1<Integer, String> f = new Function1<Integer, String>() {
    public int $tag() {
        return Function1$class.$tag(this);
    }

    public <A> Function1<A, String> compose(Function1<A, Integer> f) {
        return Function1$class.compose(this, f);
    }

    public String apply(Integer someInt) {
        return myFunc(someInt);
    }
};
MyScala.setFunc(f);

这摘自Daniel Spiewak的“Java和Scala之间的互操作”文章


推荐