【问题标题】:How to convert java.util.List[java.lang.Double] to Scala's List[Double]?如何将 java.util.List[java.lang.Double] 转换为 Scala 的 List[Double]?
【发布时间】:2014-05-23 05:30:17
【问题描述】:

我想以一种有效的方式将 Java 双精度的 Java 列表 (java.util.List[java.lang.Double]) 转换为 Scala 双精度的 Scala 列表 (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 的文档,但没有太多的其他方式。

【问题讨论】:

  • “我已经看到了从 Scala 到 Java 的文档--> Java,但没有太多的去向。”...你现在了吗?愿意分享这些信息吗? ;-)

标签: java scala implicit-conversion


【解决方案1】:

建议使用JavaConverters,而不是JavaConversions

import collection.JavaConverters._
import scala.collection.breakOut
val l: List[Double] = j.asScala.map(_.doubleValue)(breakOut)

doubleValue 会将其从java.lang.Double 转换为scala.DoublebreakOut 告诉它生成List 作为map 的结果,而不必再次遍历它以转换为List。如果您不关心额外的遍历,您也可以只使用 toList 而不是 breakOut

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

类型不同的原因是 java.lang.Double 是“盒装原语”,而 scala.Double 等价于 Java 的 double 原语。这里的转换本质上是“拆箱”原语。

【讨论】:

  • 有没有办法在没有任何遍历的情况下做到这一点?也许这是不可能的,但我天真地认为投射不会涉及任何遍历。
  • 请注意,如果您愿意准确地接受Seq 而不是List,您可以通过调用@ 将Scala 转换的Java List 转换为视图来避免遍历调用map之前的987654336@方法。这将为您提供一个懒惰评估的SeqView,它将根据需要将转换应用于元素。
【解决方案2】:
import collection.JavaConverters._

val javaList : java.util.List[Double] = ...
val scalaList : List[Double] = j.asScala.toList

【讨论】:

  • 这能够将 java.util.list[Double] 转换为 List[Double],但棘手的部分也是从 java.lang.Double 转换为 Scala Double。
  • @Erik,这不是演员表:asScala 遍历基于 java 的集合并构建一个全新的基于 scala 的集合。必须如此,因为课程完全不同。
  • @dhg,实际上你错了。 asScala 不遍历集合; asScala 在原始集合中创建一个 view。执行实际遍历的是toList。参见scala.collection.convert.Wrappers trait:它包含这些视图的实现,很明显它们只是将集合操作转发给原始 Java 集合。
  • @dhg,你是对的,但是,javaList.asScala.map(_.doubleValue).toList 将执行两次遍历,第一次发生在map,第二次发生在toList
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-16
相关资源
最近更新 更多