我希望以有效的方式将Java双打的Java列表(java.util.List [java.lang.Double])转换为Scala双打的Scala列表(List [Double])。 / p>
目前,我在列表上进行映射,将每个Double值转换为Scala Double。我不希望映射每个值,并且正在寻找一种更有效的方法。
import collection.JavaConversions._
import collection.mutable.Buffer
val j: java.util.List[java.lang.Double] = Buffer(new java.lang.Double(1.0), new java.lang.Double(2.0))
val s: List[Double] = ...
我已经看过来自Scala的文档 - > Java,但没有太多其他方式。
答案 0 :(得分:19)
建议使用JavaConverters
,而不是JavaConversions
:
import collection.JavaConverters._
import scala.collection.breakOut
val l: List[Double] = j.asScala.map(_.doubleValue)(breakOut)
doubleValue
会将其从java.lang.Double
转换为scala.Double
。 breakOut
告诉它生成List
作为map
的结果,而不必再次遍历它以转换为List
。如果你不关心额外的遍历,你也可以toList
而不是breakOut
。
Java类与Scala完全不同;这不仅仅是改变名称。因此,没有遍历就不可能进行转换。你必须创建一个全新的集合,然后查看每个元素以便(转换它)并将其移动。
类型不同的原因是java.lang.Double是一个“盒装基元”,而scala.Double相当于Java的双基元。这里的转换基本上是“拆箱”原语。
答案 1 :(得分:0)
import collection.JavaConverters._
val javaList : java.util.List[Double] = ...
val scalaList : List[Double] = j.asScala.toList