1

想象一下我有一个java列表

val javaList: java.util.List[String] = null

如果我想将它用作 scala 集合,比如说 Buffer,我只需添加以下导入(如前所述)

import scala.collection.JavaConversions._

问题是我必须检查列表是否不同于 null。这将不起作用:

javaList foreach println          //throws java.lang.NullPointerException

有没有一种简单的方法可以将 java 列表转换为 scala 集合,将 null 转换为 Buffer.empty?类似于选项工厂的东西:

Option(null)                      //> res0: Option[Null] = None
asScalaBuffer(javaList)           // I wish this to be ArrayBuffer()
4

2 回答 2

6

只需将其映射并使用 Option

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)
于 2013-07-08T14:40:45.997 回答
3

您始终可以定义自己的:

import scala.collection.JavaConverters._
def safeScala[A](xs: java.util.List[A]) = {
  if (xs == null) collection.mutable.ArrayBuffer[A]()
  else xs.asScala
}
于 2013-07-08T14:43:28.113 回答