Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将java.util.List[java.lang.Double]转换为Scala';s名单[双]?_Java_Scala_Implicit Conversion - Fatal编程技术网

如何将java.util.List[java.lang.Double]转换为Scala';s名单[双]?

如何将java.util.List[java.lang.Double]转换为Scala';s名单[双]?,java,scala,implicit-conversion,Java,Scala,Implicit Conversion,我想以一种高效的方式将Java Double列表(Java.util.list[Java.lang.Double])转换为Scala Double列表(list[Double]) 目前,我正在映射列表,将每个Double值转换为Scala Double。我不想对每一个价值都进行映射,我正在寻找一种更有效的方法来实现这一点 import collection.JavaConversions._ import collection.mutable.Buffer val j: java.util.L

我想以一种高效的方式将Java Double列表(Java.util.list[Java.lang.Double])转换为Scala Double列表(list[Double])

目前,我正在映射列表,将每个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的文档,但没有太多相反的地方。

建议使用
JavaConverters
,而不是
JavaConverations

import collection.JavaConverters._

val javaList : java.util.List[Double] = ...
val scalaList : List[Double] = j.asScala.toList
import collection.JavaConverters._
import scala.collection.breakOut
val l: List[Double] = j.asScala.map(_.doubleValue)(breakOut)
doubleValue
将其从
java.lang.Double
转换为
scala.Double
breakOut
告诉它作为
映射的结果生成一个
列表
,而无需再次遍历它以转换为
列表
。如果不关心额外的遍历,也可以只执行
toList
而不是
breakOut

Java类与Scala类是完全不同的对象;这不仅仅是名字的改变。因此,不进行遍历就不可能进行转换。您必须创建一个全新的集合,然后查看每个元素,以便(转换并)移动它


这些类型不同的原因是java.lang.Double是一个“装箱原语”,而scala.Double相当于java的Double原语。这里的转换本质上是“取消绑定”原语。

有没有一种方法可以在不进行任何遍历的情况下进行转换?也许这是不可能的,但我天真地认为强制转换不会涉及任何遍历。请注意,如果您愿意接受
Seq
而不是
列表,通过在调用
map
之前调用
view
方法,将Scala转换的Java
列表转换为视图,可以避免遍历。这将为您提供一个延迟计算的
SeqView
,该视图将根据需要对元素应用转换。这可以将java.util.list[Double]转换为list[Double],但棘手的部分也是从java.lang.Double转换为Scala Double。@Erik,它不是一个cast:
asScala
遍历基于java的集合并构建一个全新的基于scala的集合。这是必须的,因为类别完全不同。@dhg,事实上你错了
asScala
不遍历集合
asScala
在原始集合中创建一个视图。它是执行实际遍历的
toList
。请参见
scala.collection.convert.Wrappers
trait:它包含这些视图的实现,很明显它们只将收集操作转发到原始Java集合。@dhg,您是对的,但是
javaList.asScala.map(u.doubleValue).toList
将执行两次遍历,第一个出现在
map
,第二个出现在
toList
“我已经看到了Scala-->Java的文档,但没有太多相反的地方。”。。。你现在知道了吗?愿意分享这些信息吗?;-)我找到了答案: