使用Java中的Scala的左右两边

Mik*_*inn 3 java scala

Java程序如何将值包装到scala.Either?例如,下面的Scala代码将如何用Java编写?

Right("asdf")
Left(new Exception())
Run Code Online (Sandbox Code Playgroud)

以下失败,"无法找到符号方法apply(java.lang.String)"

Right.apply("asdf");
Run Code Online (Sandbox Code Playgroud)

以下失败,"无法找到符号方法apply(java.lang.Exception)"

Left.apply(new Exception());
Run Code Online (Sandbox Code Playgroud)

Tom*_*icz 8

如果我正确理解了这个问题,假设你有以下Scala方法:

def foo(stringOrDate: Either[String, Date]) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

您可以通过单个创建Either子类实例从Java代码中调用它:

scalaObject.foo(new Left<String, Date>("abc"));
scalaObject.foo(new Right<String, Date>(new Date()));
Run Code Online (Sandbox Code Playgroud)

如果要从Java代码传递函数,则必须Function*根据函数arity 实现特征:

def foo(stringOrStringFun: Either[String, () => String]) {
    //...
}
Run Code Online (Sandbox Code Playgroud)

在Java中:

scalaObject.foo(new Left<String, scala.Function0<String>>("abc"));
scalaObject.foo(new Right<String, scala.Function0<String>>(
        new scala.Function0<String>() {
            @Override
            public String apply() {
                throw new RuntimeException();
            }
        }));
Run Code Online (Sandbox Code Playgroud)

当然在Scala中它更简单,因为它在语法级别支持lambdas:

foo(Left("abc"))
foo(Right(throw new RuntimeException()))
Run Code Online (Sandbox Code Playgroud)