【问题标题】:Scala - Use different equality comparisons/hashing for the same typeScala - 对同一类型使用不同的相等比较/散列
【发布时间】:2014-09-22 15:47:49
【问题描述】:

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

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

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

【问题讨论】:

标签: java scala hashcode equality


【解决方案1】:

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多