【问题标题】:Convert a Java List of Lists to Scala without O(n) iteration?在没有 O(n) 迭代的情况下将 Java 列表转换为 Scala?
【发布时间】:2014-07-31 20:31:17
【问题描述】:

this question 的答案很好地解释了如何使用 Scala 的 Java 转换器将 Java 列表更改为 Scala 列表。不幸的是,我需要将列表列表从 Java 转换为 Scala 类型,并且该解决方案不起作用:

// pseudocode
java.util.List[java.util.List[String]].asScala
  -> scala.collection.immutable.List[java.util.List[String]]

有没有一种方法可以在不对 Java 对象进行 O(N) 迭代的情况下进行这种转换?

【问题讨论】:

  • 可能用(Indexed)Seq可以,但是immutable.List是一个具体的类型,所以不是,你要提前付出代价(其中N是外部列表)。
  • 您确定要避免吗?你试过jlistOfjList.asScala.map(_.asScala)吗?
  • @Daenyth 成功了!
  • @Cory,所以你只是在开玩笑说需要它低于 O(n)?
  • @dhg 我绝对应该更准确地表达我的问题。我想要避免的是丑陋的foreach 或迭代,因为我习惯于来自 Java 和 C++。我什至不知道在 Scala 中可以实现像 jlistOfjList.asScala.map(_.asScala) 这样优雅的东西。我应该说我想要一个 优雅的 解决方案,而不是避免 O(N) 迭代的解决方案。简而言之,不,我不是在开玩笑,我只是误解了我的意图。

标签: list scala scala-collections


【解决方案1】:

您还需要转换嵌套列表,但这需要预先 O(n):

import scala.collection.JavaConverters._

val javaListOfLists = List(List("a", "b", "c").asJava, List("d", "e", "f").asJava).asJava
val scalaListOfLists = javaListOfLists.asScala.toList.map(_.asScala.toList)

或者,您可以将外部列表转换为 Stream[List[T]],这只会在您访问每个项目时应用转换成本

val scalaStreamOfLists = javaListOfLists.asScala.toStream.map(_.asScala.toList)

如果您根本不想支付转换成本,您可以围绕 java.util.List 编写一个包装器,它会为您提供一个 scala 集合接口。一个粗略的镜头是:

def wrap[T](javaIterator: java.util.Iterator[T]): Stream[T] = {
  if (javaIterator.hasNext)
    javaIterator.next #:: wrap(javaIterator)
  else
    empty
}

val outerWrap = wrap(javaListOfLists.iterator).map(inner => wrap(inner.iterator()))

【讨论】:

    【解决方案2】:

    您也可以使用我专门为此目的编写的 scalaj-collection

    import com.daodecode.scalaj.collection._
    
    val listOfLists: java.util.List[java.util.List[String]] = ...
    val s: mutable.Seq[mutable.Seq[String]] = listOfLists.deepAsScala
    

    就是这样。它将所有嵌套的 java 集合和原始类型转换为 scala 版本。您还可以使用 deepAsScalaImmutable 直接转换为不可变数据结构(当然会有一些复制开销)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-09
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      相关资源
      最近更新 更多