如何在Scala中使用Java Optional对象?

时间:2019-03-28 13:34:30

标签: java scala

我必须在Scala中使用Java函数,该函数接受类型为Optional<Type>的参数,并且我必须传递给它的对象也来自Java库,但类型仅为Type。如何在Scala中使用它?

可以,如果我像这样打字的话。请注意,这里javaObj来自Java库,类型为Type。但是这里的someFunctionDefinedInAJavaLibrary函数需要一个Optional<Type>类型的参数。

import java.util.Optional
....
// javaObj here is of type Type and comes from a Java library
val scalaObj: Optional[Type] = javaObj.asInstanceOf[Optional[Type]]
// someFunctionDefinedInAJavaLibrary's argument is of type Optional<Type>
val r = someFunctionDefinedInAJavaLibrary(scalaObj)

2 个答案:

答案 0 :(得分:6)

字面上应该与Java中的1:1相同:

someFunctionDefinedInAJavaLibrary(Optional.of(javaObj))

从Java-API调用函数时,只需忘记存在asInstanceOfscala.Option


如果您实际上必须在Java的Optional和Scala的Option之间进行翻译,则可以使用scala-java8-compatmaven central),但是在这种特殊情况下没有必要,因为任何地方都没有Option

答案 1 :(得分:1)

Some("abc").asInstanceOf[Optional[String]]不起作用,因为Scala Option和Java Optional是不相关的类型。

您可以包括a Java8-compatibility library以便在类型之间进行转换(就像与您可能熟悉的Java集合兼容的类型),或者只是手动进行。

 def toJavaOptional[A](maybeA: Option[A]): Optional[A] = 
    maybeA.fold(Optional.empty)(a => Optional.of(a))

 def toScalaOption[A](maybeA: Optional[A]): Option[A] =
    if (maybeA.isEmpty) None else Some(maybeA.get)

  

javaObj的类型为Type,而不是Optional<Type>,但是函数需要Optional<Type>

然后执行与Java中相同的操作(它也不会自动将Type“装箱”到Optional<Type>中):

callJavaFunction(Optional.of(a)) 

您可以直接在Scala中使用所有Java API方法,包括Optional.of