使用Java中的Scala:将函数作为参数传递
考虑下面的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中传递函数最简单的解决方法是什么?我想要一个通用的解决方案,它可以处理具有任意数量参数的函数
编辑:Java8是否有比下面讨论的经典解决方案更好的语法
# 1 楼答案
对我来说,最简单的方法是定义一个java接口,如:
然后修改scala代码,重载
setFunc
以同时接受JFunction
对象,例如:您自然会使用scala的第一个定义,但仍然可以使用java的第二个定义:
# 2 楼答案
您必须在Java中手动实例化
Function1
。比如:这是取自Daniel Spiewak’s “Interop Between Java and Scala” article
# 3 楼答案
下面是我尝试的一个解决方案,一个小库:https://github.com/eirslett/sc8
将Java8lambda封装在F(…)然后它被转换成Scala函数
# 4 楼答案
在
scala.runtime
包中,有一些抽象类命名为AbstractFunction1
等等,用于其他算术运算。要从Java中使用它们,只需重写apply
,如下所示:如果您使用的是Java8,并且希望使用Java8Lambda语法,请查看https://github.com/scala/scala-java8-compat