想象一下,我有一个java列表
val javaList: java.util.List[String] = null
如果我想将它用作scala集合,那么让我们说缓冲区,我只需添加以下导入(如前所述多次)
import scala.collection.JavaConversions._
问题是我必须检查列表是否与null不同。这不起作用:
javaList foreach println //throws java.lang.NullPointerException
有没有一种简单的方法可以将java list转换为scala集合,将null转换为Buffer.empty?类似于Option工厂的东西:
Option(null) //> res0: Option[Null] = None
asScalaBuffer(javaList) // I wish this to be ArrayBuffer()
答案 0 :(得分:5)
只需将其映射并使用选项
即可Option(javaList).map(asScalaBuffer).getOrElse(ArrayBuffer.empty)
<强>更新强>
如果您仍然需要null
数组/列表的工厂,那么您可以通过“构造函数方法”进行模拟(基于Rex Kerr的答案):
def ArrayBuffer[T](jl: JavaList[T]) = if (jl == null) ArrayBuffer.empty[T] else asScalaBuffer(jl)
然后使用ArrayBuffer(null.asInstanceOf[JavaList[String])
它看起来就像Option.apply
:
def apply[A](x: A): Option[A] = if (x == null) None else Some(x)
答案 1 :(得分:3)
您可以随时定义自己的:
import scala.collection.JavaConverters._
def safeScala[A](xs: java.util.List[A]) = {
if (xs == null) collection.mutable.ArrayBuffer[A]()
else xs.asScala
}