对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,那么以干净的方式执行此操作的最佳方法是什么. 有人可以推荐一种解决这种区分大小写问题的惯用方法吗? 谢谢, 解决方法
我不会为了案例类而损害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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |