В коде Java, как правильно обрабатывать будущее scala в формате Future [Попробуйте [Option [Map [String, Any]]]] - PullRequest
0 голосов
/ 03 февраля 2020

Мне нужно вызвать scala API в java коде. API scala выглядит следующим образом: def get(id: String): Future[Try[Option[Map[String, Any]]]]

В java коде, как правильно обращаться с будущим [Попробуйте [Option]] и получить Map, если все прошло успешно? Если есть исключение или Future - сбой, перезапустите RuntimeException.

1 Ответ

0 голосов
/ 03 февраля 2020

Future[Try[Option[Map[String, Any]]]]

Это перебор, потому что результат оценки будущего уже выглядит как попытка. Итак, пусть у вас есть такое будущее, тогда самый простой способ - это использовать Await.result и затем прорезать стек типов:

Future<Try<Option<Map<String, Any>>>> yourFuture = yourFunc(...);
scala.concurrent.duration.FiniteDuration timeout = new FiniteDuration(..., ...);
/*simplest, but not the best way of doing so, it will throw an exception if something goes wrong, you probably want to wrap this in try-catch block in real code*/

Try<Option<Map<String, Any>>> result = Await.result<Try<Option<Map<String, Any>>>>(yourFuture, timeout);

if(result.isSuccess()){
  Option<Map<String, Any>> option = result();
  if(option.nonEmpty()){
    Map<String, Any> mapYouNeed = option.get(); 
  } else {
  //  throw your exception
  }
} else {
  //  throw your exception
}

Больше информации о Futures и Await в scala документах. https://www.scala-lang.org/api/2.12.9/scala/concurrent/Await $. html

...