0
我見過如何將Map[String,String]
(如("id"->"1", "name"->"andre")
)轉換爲案例類User(id:String,name:String)
的示例,但它們涉及調用一個方法mapToUser
- 例如:使用隱式方法將映射[字符串,字符串]映射到案例類用戶(id,名稱)
val r = User.mapToUser(u.get)
println("information for " + r.name + " with id " + r.id)
case class User(id: String, name: String)
object User {
implicit def userToMap(user: User): Map[String, String] = {
Map("id" -> user.id, "name" -> user.name)
}
implicit def mapToUser(m: Map[String, String]) : User = {
User(m.get("id").get, m.get("name").get)
}
def unapply(arg: Map[String,String]): User = User(arg.get("id").get, arg.get("name").get)
}
斯卡拉深諳如何使用的User
到Map[String,String]
第一隱式轉換還我沒有打電話給userToMap
,但不明白爲什麼它的失敗做轉換例如 var r = u.get.asInstanceOf[User]
。它說,它無法將值轉換爲用戶 - 我想.to[User]
也和說
Error:(73, 24) User takes no type parameters, expected: one val r = u.get.to[User]
全碼:
import scredis._
import scala.concurrent.Future
import scala.util.{Failure, Success}
case class User(id: String, name: String)
object User {
implicit def userToMap(user: User): Map[String, String] = {
Map("id" -> user.id, "name" -> user.name)
}
implicit def mapToUser(m: Map[String, String]) : User = {
User(m.get("id").get, m.get("name").get)
}
def unapply(arg: Map[String,String]): User = User(arg.get("id").get, arg.get("name").get)
}
object RedisClient {
val redis = new Redis(host="192.168.122.2", passwordOpt = Some("privatemachine"))
import redis.dispatcher
def save(key:String, x : User) : Unit = {
x.foreach {
f => redis.hSet(key, f._1, f._2).onComplete{
case Success(content) => None
case Failure(e) => e.printStackTrace()
}
}
}
def get(key:String) : Future[Option[Map[String,String]]] = {
val result = redis.hGetAll(key)
result.onComplete {
case Success(content) => {
println(" --> " + content)
}
case Failure(e) => e.printStackTrace()
}
result
}
}
object Run extends App {
val redis = new Redis(host="192.168.122.2", passwordOpt = Some("privatemachine"))
import redis.dispatcher
redis.hSet("my-hash", "maker", "BMW")
redis.hGetAll("my-hash") onComplete {
case Success(content) => {
println(content)
}
case Failure(e) => e.printStackTrace()
}
val u1 = User("1", "andre")
RedisClient.save("user_1", u1)
val userResult = RedisClient.get("user_1")
userResult.map {
u =>
//val r = User.mapToUser(u.get)
val r = u.get.to[User]
println("information for " + r.name + " with id " + r.id)
}.onFailure{ case x => println("Look here : " + x)}
}
你不應該使用鑄造('。爲[用戶]') - 只定義'r'的類型明確地是'用戶'和隱式轉換將能夠將'u.get'(我認爲是一個'Map [String,String]')轉換成'User':'val r:User = u.get' –
它,你是否在意這是一個答案? –