【问题标题】:How to create a List in Scala from existing list with type conversion?如何通过类型转换从现有列表在 Scala 中创建列表?
【发布时间】:2012-07-24 12:20:42
【问题描述】:

上下文

我有一个这样的列表:

List[(User)]

我需要一个这样的列表:

List[(String, String)]

用户定义如下:

case class User(
    id:Pk[Long] = NotAssigned, 
    name: String
)    

事实上,初始列表是从类构建的:

试过了:

我的第一次“幼稚”尝试(来自 Java)是:

myList.map { u => u.id.get.toString, u.name }

我有一个错误:

required List[(String, String)] 
given List[(java.lang.String, String)]

解决方案

正如评论中引用的帖子中提到的,Scala 有一个 String 类型,它是 java.lang.String 的扩展。使用推理时,Scala 不会转换为 Scala 超类。为了使用 Scala String 类型,您必须显式定义返回类型。

示例:

// Returns List[(java.lang.String, String)]
myList.map { u => u.id.get.toString, u.name }

// Returns List[(String, String)]
def convert(m:List[User]):List[(String, String)] = {
    m.map { u => u.id.get.toString, u.name }    
}

【问题讨论】:

  • 这里的故事有问题。 scala.Predef.Stringjava.lang.String别名。您可以随意混合它们的用法,没有任何问题。

标签: java string scala playframework-2.0


【解决方案1】:

为什么这不起作用?

def method(a:List[(Long,String)]):List[(String,String)] = a.map { case (value1,value2) => (value1.toString,value2)}

【讨论】:

  • 不,给一个 List[(java.lang.String, String)]
【解决方案2】:

你很接近。只需要加括号。

myList.map { u => (u.id.get.toString, u.name) }

或者你可以使用User的提取器。

myList.map { case User(id, name) => (id.get.toString, name) }

【讨论】:

  • 是的,我在写问题时忘记了括号,但我的代码中有括号。
【解决方案3】:

这在我的 REPL 中有效:

scala> case class User (id: Option[Long] = None, name:String)
defined class User

scala> val users = User(name = "Name") :: User(name = "LastName") :: Nil
users: List[User] = List(User(None,Name), User(None,LastName))

scala> val pairs = users.map{u => u.id.toString -> u.name}
pairs: List[(String, String)] = List((None,Name), (None,LastName))

【讨论】:

    【解决方案4】:
    val xs: List[(Long, String)] = List((1l, "A"), (2l, "B"))
    val ys: List[(String, String)] = xs.map{case (a, b) => (a.toString, b)}
    

    在上述解决方案中,为了能够将元组分解为其组成部分(此处为 ab),使用了部分函数(实际上恰好是给定域的总函数) .

    您还可以使用元组的访问器方法来访问组件:

    val zs: List[(String, String)] = xs.map(t => (t._1.toString, t._2))
    

    【讨论】:

      【解决方案5】:

      怎么样:

      myList.map(t => t._1+"" -> t._2)
      

      或者:

      myList.map { case(k,v) => (k.toString, v) }
      

      【讨论】:

      • @i.am.michiel 你确定你的初始名单是List[(Long, String)]
      • 这有点复杂,但是是的。我将在我的问题中添加更多信息。
      猜你喜欢
      • 2022-08-13
      • 2015-01-17
      • 1970-01-01
      • 2023-03-25
      • 2019-02-24
      • 1970-01-01
      • 2020-08-04
      • 2020-03-12
      • 1970-01-01
      相关资源
      最近更新 更多