2

语境

我有一个这样的列表:

List[(User)]

我需要一个这样的列表:

List[(String, String)]

用户定义如下:

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

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

试过:

我的第一次“天真”尝试(来自 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 }    
}
4

5 回答 5

4

为什么这行不通?

def method(a:List[(Long,String)]):List[(String,String)] = a.map { case (value1,value2) => (value1.toString,value2)}
于 2012-07-24T12:31:33.967 回答
4

你很亲密。只需要加上括号。

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

或者您可以将提取器用于User.

myList.map { case User(id, name) => (id.get.toString, name) }
于 2012-07-24T12:53:26.867 回答
2

这适用于我的 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))
于 2012-07-24T12:55:59.153 回答
1
val xs: List[(Long, String)] = List((1l, "A"), (2l, "B"))
val ys: List[(String, String)] = xs.map{case (a, b) => (a.toString, b)}

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

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

val zs: List[(String, String)] = xs.map(t => (t._1.toString, t._2))
于 2012-07-24T12:24:43.993 回答
1

怎么样:

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

或者:

myList.map { case(k,v) => (k.toString, v) }
于 2012-07-24T12:25:51.233 回答