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

scala – 修剪案例类的String字段的值

发布时间:2020-12-16 18:14:53 所属栏目:安全 来源:网络整理
导读:我正在使用 shapeless编写一个泛型函数,它接受一个case类的实例并修剪字符串的所有字段值.案例类可以有可选字段,嵌套对象,列表等. 我有一个案例类人. case class Person(name: Option[String],address: List[String],friends: List[Person]) 我目前拥有的功
我正在使用 shapeless编写一个泛型函数,它接受一个case类的实例并修剪字符串的所有字段值.案例类可以有可选字段,嵌套对象,列表等.

我有一个案例类人.

case class Person(name: Option[String],address: List[String],friends: List[Person])

我目前拥有的功能:

import shapeless._,ops.hlist._

  object trimmer extends Poly1 {
    implicit val stringOptCase = at[Option[String]](_.map(_.trim))
    implicit val stringListCase = at[List[String]](_.map(_.trim))
    implicit def skipCase[A] = at[A](identity)
  }

  def trimStringValues[A,R <: HList](a: A)(implicit
                                     gen: Generic.Aux[A,R],mapper: Mapper.Aux[trimmer.type,R,R]
  ) = gen.from(mapper(gen.to(a)))

当我使用上面的函数时,它只适用于Person类的根级别名称字段.它不适用于列表或对象字段.

val person = Person(name = Some(" john "),address = List(" ny"," vegas "),friends = List(Person(Some(" alicia"),List(" peter"),Nil)))

trimStringValues(person) // Person(Some(john),List(ny,vegas),List(Person(Some( alicia),List( peter),List())))

我怎么解决这个问题?

解决方法

首先,它似乎确实在您的注释输出中处理地址和名称,这是预期的.它不适用于朋友,因为List [Person]匹配skipCase情况 – 它既不是Option [String],也不是List [String].

解决这个问题的最简单方法是使用Shapeless的无处不在的组合器.鉴于上面的代码,您可以编写以下代码:

scala> shapeless.everywhere(trimmer)(person)
res1: Person = Person(Some(john),List(Person(Some(alicia),List(peter),List())))

事实上,你可以通过更简单的微调实现来完成同样的事情:

object trimStrings extends Poly1 {
  implicit val stringCase: Case.Aux[String,String] = at[String](_.trim)
}

或者等效但更简洁:

import shapeless.poly.->

object trimStrings extends (String -> String)(_.trim)

然后:

scala> shapeless.everywhere(trimStrings)(person)
res5: Person = Person(Some(john),List())))

如果您想要更精确地控制哪些字符串被修剪,您可以返回到原始实现,并添加一个显式的List [Person]大小写,或者更符合此类型的更通用的大小写,并递归地应用trimmer.既然你说要修剪所有琴弦,那么每个地方听起来都像是你想要的.

(编辑:李大同)

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

    推荐文章
      热点阅读