【问题标题】:Best solution for converting java.util.List to Scala list将 java.util.List 转换为 Scala 列表的最佳解决方案
【发布时间】:2014-04-23 01:46:45
【问题描述】:

我正在尝试将 java.util.List 转换为 Scala 列表。 674713 帖子中有很多可能性,所以我想知道哪一个是最好的。我正在使用 Play 2.1.1。我的模型是:

case class Page[T](
    var data: java.util.List[T],
    var previous: String,
    var next: String,
    var totalPageCount: Int)(implicit val tWrites: Writes[T])

object Page {

    implicit def pageWrites[T: Writes]: Writes[Page[T]] = (
        (__ \ 'data).write[java.util.List[T]] and
        (__ \ 'previous).write[String] and
        (__ \ 'next).write[String] and
        (__ \ 'totalPageCount).write[Int])(unlift(Page.unapply[T]))
}

此代码不起作用,因为我需要为通用 java.util.List[T] 类型添加编写器。

我已将此添加到我的对象页面:

implicit def listWrites[T](implicit fmt: Writes[T]): Writes[List[T]] = new Writes[List[T]] {
    def writes(ts: List[T]) = JsArray(ts.map(t => Json.toJson(t)(fmt)))
}

但这会在执行我的项目时产生错误(listWrites 上的“MatchError: null”)。因此,我想将我的 java.util.List 转换为 Scala,以避免使用这个不起作用的编写器。有什么解决办法吗?

【问题讨论】:

标签: scala


【解决方案1】:

作为默认我会开始:

import scala.collection.JavaConverters._
data.asScala //var data: java.util.List[T]

这将返回一个缓冲区,因为 JavaList 是可变的。要转换为 List,您还必须调用 toList 方法

data.asScala.toList //List[T]

这将使转换变得明确,可读性短,并且由于它是标准库的一部分,因此必然适用于不同的版本。

这是通过添加隐式转换的解决方案。如果您导入转换,您现在应该可以调用 data.toScalaList

object Example {
  implicit class Data[T](data: java.util.List[T]) {
    import scala.collection.JavaConverters._
    def toScalaList: List[T] = data.asScala.toList
  }
}

//just import it with
import Example._

【讨论】:

  • 为我工作:scala> 新 java.util.LinkedList[String].asScala res3:scala.collection.mutable.Buffer[String] = Buffer()。您使用的是哪个版本的 Scala。该示例基于 2.10。
  • 我正在使用 Play 2.1.1。所以我认为它也是 Scala 2.1。
  • 转换器从 2.8 开始成为 Scala 的一部分。看看你的 build.sbt。这里应该有一个键 scalaVersion := 表示版本。
  • 我没有 build.sbt(因为我可能正在使用 Play?)但我有转换器,因为我可以访问 asScalaMapConverters 方法,例如它是 JavaConverters 的一部分。我只是想念 asScala。
  • 我有一个大写的“AsJava”,所以我不确定这是我应该使用的。事实上,当我使用它时,我并没有 toList 方法。
猜你喜欢
  • 2010-09-27
  • 2013-04-16
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多