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

对Scala案例类执行不区分大小写的比较的最佳方法

发布时间:2020-12-16 18:39:30 所属栏目:安全 来源:网络整理
导读:我有一个代表一个人的案例类. case class Person(firstName: String,lastName: String) 我需要以不区分大小写的方式根据名字和姓氏进行人物比较,例如: Person("John","Doe") == Person("john","Doe") // should return true 或者在Seq Seq(Person("John","D
我有一个代表一个人的案例类.

case class Person(firstName: String,lastName: String)

我需要以不区分大小写的方式根据名字和姓氏进行人物比较,例如:

Person("John","Doe") == Person("john","Doe") // should return true

或者在Seq

Seq(Person("John","Doe")).contains(Person("john","Doe")

最简单的方法是覆盖Person case类中的equals和hashCode方法,但是如果在类的情况下不能覆盖equals和hashCode,那么以干净的方式执行此操作的最佳方法是什么.

有人可以推荐一种解决这种区分大小写问题的惯用方法吗?

谢谢,
Suriyanto

解决方法

我不会为了案例类而损害equals,hashCode的原始含义,因此,==.从函数式编程的角度来看,恕我直言这里最惯用的解决方案是使用类型类:

case class Person(firstName: String,lastName: String)

trait Equal[A] {
  def eq(a1: A,a2: A): Boolean
}

object Equal {
  def areEqual[A : Equal](a1: A,a2: A): Boolean = implicitly[Equal[A]].eq(a1,a2)

  implicit object PersonEqual extends Equal[Person] {
    override def eq(a1: Person,a2: Person): Boolean = a1.firstName.equalsIgnoreCase(a2.firstName) &&
      a1.lastName.equalsIgnoreCase(a2.lastName)
  }
}

在REPL会话中:

scala> import Equal.areEqual
import Equal.areEqual

scala> val p1 = Person("John","Doe")
p1: Person = Person(John,Doe)

scala> val p2 = p1.copy(firstName = "john")
p2: Person = Person(john,Doe)

scala> areEqual(p1,p2)
res0: Boolean = true

scala> val p3 = p1.copy(lastName = "Brown")
p3: Person = Person(John,Brown)

scala> areEqual(p1,p3)
res1: Boolean = false

这样,如果您需要在给定的上下文中为Person提供不同的相等含义,您可以实现您的Equal [Person]版本,而无需触及任何其他内容.例如:在代码的给定点,如果两个Person实例具有相同的姓氏,则它们是相等的:

implicit object PersonLastnameEqual extends Equal[Person] {
  override def eq(a1: Person,a2: Person): Boolean = a1.lastName.equalsIgnoreCase(a2.lastName)
}

REPL会议:

scala> val p1 = Person("John",Doe)

scala> val p2 = p1.copy(firstName = "Mary")
p2: Person = Person(Mary,p2)
res0: Boolean = true

(编辑:李大同)

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

    推荐文章
      热点阅读