使用Java中的Scala的左右两边

时间:2012-01-29 21:51:33

标签: java scala

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

Right("asdf")
Left(new Exception())

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

Right.apply("asdf");

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

Left.apply(new Exception());

1 个答案:

答案 0 :(得分:8)

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

def foo(stringOrDate: Either[String, Date]) {
    //...
}

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

scalaObject.foo(new Left<String, Date>("abc"));
scalaObject.foo(new Right<String, Date>(new Date()));

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

def foo(stringOrStringFun: Either[String, () => String]) {
    //...
}

在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();
            }
        }));

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

foo(Left("abc"))
foo(Right(throw new RuntimeException()))