【发布时间】:2023-03-19 11:18:02
【问题描述】:
我最近一直在玩 Scala/Java 互操作,特别是从 Java (7) 调用 Scala (2.10.4) 代码。这比我预期的要愉快,但有几件事让我感到困惑。
例如,在scala.runtime 中,我有一个很好的AbstractFunction 抽象类集合。但是对于没有返回值的方法,我看不到任何东西。例如,假设我有以下 Scala 代码:
class MyClass(name: String) {
def SayWhat(say_fn: String => Unit) = say_fn(name)
}
我的理解是 Java 的 void 或多或少是 Scala 的 Unit,所以我可以使用以下 Java 匿名类传递一些类似于 lambda 的东西:
import scala.Function1;
import scala.runtime.AbstractFunction1;
import scala.runtime.BoxedUnit;
public class MyProgram {
public static void main(String[] args) {
MyClass mc = new MyClass("Dan");
Function1<String, BoxedUnit> f = new AbstractFunction1<String, BoxedUnit>() {
public BoxedUnit apply(String s) {
System.out.println("Why, hello there " + s);
return null;
}
};
mc.SayWhat(f);
}
}
这显然不是最漂亮的东西,但我很欣赏AbstractFunction 的东西,真的,与我必须做的事情相比!但是真的没有AbstractProcedure 什么的吗?另外,为什么我的“lambda”必须返回BoxedUnit?
【问题讨论】:
-
您可以使用函数
def apply[T](f:T=>_):T=>Unit = x =>f(x)添加一个AbstractProcedure对象。
标签: java scala lambda scala-java-interop