加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 将数据库(或键值存储)中的[String,Object]映射到无形可

发布时间:2020-12-16 19:18:29 所属栏目:安全 来源:网络整理
导读:将[String,Object]从DB(或键值存储)映射到无形可扩展记录 例: 让我们说我有一张地图 val fromDB: Map[String,Any] = Map("name" - "John","age" - 25) 知道字段“name”应该是一个字符串而字段“age”应该是一个整数,我如何将其转换为如下的无形可扩展记录
将[String,Object]从DB(或键值存储)映射到无形可扩展记录

例:

让我们说我有一张地图

val fromDB: Map[String,Any] = Map("name" -> "John","age" -> 25)

知道字段“name”应该是一个字符串而字段“age”应该是一个整数,我如何将其转换为如下的无形可扩展记录?

val user = ("name" ->> "John") :: ("age"  ->> 25) :: HNil

我的最终目标是创建一个如下对象,可以使用字段使用函数“fromDB”转换Map.

object User {

  object name extends FieldOf[String]
  object age extends FieldOf[Int]

  def fromDB(data: Map[String,Any]) = {
    //TODO
  }
}

我也愿意接受其他建议以及这样做的方法.谢谢.

解决方法

你可以使用TypeCase提取器来写得非常干净:

import shapeless._,syntax.singleton._

val StrCase = TypeCase[String]
val IntCase = TypeCase[Int]

def toUserRecord(m: Map[String,Any]) = for {
   StrCase(name) <- m.get("name")
   IntCase(age)  <- m.get("age")
} yield ("name" ->> name) :: ("age" ->> age) :: HNil

或者你可以使演员更明确一点:

import syntax.typeable._

def toUserRecord(m: Map[String,Any]) = for {
  name <- m.get("name").flatMap(_.cast[String])
  age  <- m.get("age").flatMap(_.cast[Int])
} yield ("name" ->> name) :: ("age" ->> age) :: HNil

请注意,我正在返回一个Option [LongRecordTypeHere]以保持此类型安全 – 如果地图中不存在键或者值无法转换为正确的类型,我们将获得无.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读