Scala - 对同一类型使用不同的相等比较/散列

时间:2014-07-30 20:31:08

标签: java scala hashcode equality

因此,在.NET中,您可以定义IEqualityComparer的实现,并将它们传递给DictionaryHashSet的构造函数。否则,集合将查看EqualsGetHashCode方法。

当您有多种比较对象的方法时,这非常有用。例如,您可以按主键,域名,电子邮件地址等查找Person

Java和Scala中是否有成语用于实现同样的目的?我认为创建多个子类比简单地覆盖hashCodeequals更容易。

1 个答案:

答案 0 :(得分:0)

Google 的 Guava Java 库提供了一个 Equivalence 类来实现自定义等价关系。它不支持直接更改 SetMap 的等价语义,但可用于包装元素,以便可以使用自定义等价关系进行比较。

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;