Использование Scala в обоих направлениях: справа и слева от Java - PullRequest
3 голосов
/ 30 января 2012

Как Java-программа может обернуть значение в scala.Either? Например, как следующий код Scala будет написан на Java?

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

Не удается найти следующее: «Не удается найти метод символа apply (java.lang.String)» *

Right.apply("asdf");

Не удается найти следующее: «Не удается найти способ применения символа (java.lang.Exception)»

Left.apply(new Exception());

1 Ответ

8 голосов
/ 30 января 2012

Если я правильно понимаю вопрос, предположим, что у вас есть следующий метод Scala:

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

Вы можете вызвать его из кода Java, создав единственные экземпляры Either подклассов:

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

Если вы хотите передать функции из кода Java, вы должны реализовать черту 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 намного проще, поскольку поддерживает лямбды на уровне синтаксиса:

foo(Left("abc"))
foo(Right(throw new RuntimeException()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...