2017-09-13 40 views
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) 
} 

斯卡拉深諳如何使用的UserMap[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)} 

} 
+1

你不應該使用鑄造('。爲[用戶]') - 只定義'r'的類型明確地是'用戶'和隱式轉換將能夠將'u.get'(我認爲是一個'Map [String,String]')轉換成'User':'val r:User = u.get' –

+0

它,你是否在意這是一個答案? –

回答

1

您沒有顯式調用任何的隱式方法,也不應該使用鑄造。隱式轉換可以簡單地通過在給定匹配轉換的情況下嘗試將一種類型的實例分配給另一種類型的變量/值來應用。

你的情況

因此,使用這些轉換會進行如下:

val map = Map("id" -> "1", "name" -> "2") 
val u: User = map // implicit conversion into User 
val m: Map[String, String] = u // implicit conversion back into Map