gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:53:38 25 4
gpt4 key购买 nike

我有一个代表一个人的案例类。

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 方法,但是由于在 case class 中覆盖 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 session 中:
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 session :
scala> val p1 = Person("John", "Doe")
p1: Person = Person(John,Doe)

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

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

关于scala - 对 Scala 案例类执行不区分大小写比较的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32773042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com