因此,在.NET中,您可以定义IEqualityComparer
的实现,并将它们传递给Dictionary
或HashSet
的构造函数。否则,集合将查看Equals
和GetHashCode
方法。
当您有多种比较对象的方法时,这非常有用。例如,您可以按主键,域名,电子邮件地址等查找Person
Java和Scala中是否有成语用于实现同样的目的?我认为创建多个子类比简单地覆盖hashCode
和equals
更容易。
答案 0 :(得分:0)
Google 的 Guava Java 库提供了一个 Equivalence
类来实现自定义等价关系。它不支持直接更改 Set
或 Map
的等价语义,但可用于包装元素,以便可以使用自定义等价关系进行比较。
Person person1 = Person.withEmail("john.doe@example.com");
Person person2 = Person.withEmail("jane.doe@example.com");
Person person3 = Person.withEmail("john.doe@example.com");
Equivalence<Person> emailEquivalence = Equivalence.equals().onResultOf(Person::getEmail);
Set<Equivalence.Wrapper<Person>> set =
Set.of(emailEquivalence.wrap(person1), emailEquivalence.wrap(person2));
assert set.contains(emailEquivalence.wrap(person3));
Map<Equivalence.Wrapper<Person>, Integer> map =
Map.of(emailEquivalence.wrap(person1), 1, emailEquivalence.wrap(person2), 2);
assert map.get(emailEquivalence.wrap(person3)) == 1;