gpt4 book ai didi

java - 在java中覆盖 "equals"的clojure等价物是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 19:30:23 25 4
gpt4 key购买 nike

我最近询问了 clojure 中映射中的组合键:How can you implement Composite keys in clojure? ...

答案是它们的工作方式类似于 java 键 - 如果某些东西覆盖了“等于”,那么它就可以有效地用作键。

我想知道:是否存在允许我们覆盖自定义数据结构的“等于”的宏?例如,假设我想使用 Map 作为键,并将唯一性定义为“如果此 map 包含 2 个或更多与另一个 map 相同的元素,则它们相等”。我如何覆盖 map 的默认行为?

在 java 中,我发现这个工具在制作以数千个 bean 作为键的高速 map 时非常强大。

最佳答案

为了让这个讨论更加清晰,在 Java 中通常会覆盖 hashCodeequals。例如,您正在尝试跟踪有姓名但也可能有昵称的员工。目标是确保这些员工不重复。在这种情况下,我会覆盖 equalshashCode 以仅查看员工的 ID。当这些员工被输入到 Set 数据结构中时,他们不会被复制。在 Clojure 中,您可以这样做:

(deftype Employee [name id]
Object
(equals [a b] (= (.id a) (.id b)))
(hashCode [this] (.hashCode (.id this)))
(toString [this] (.name this)))

(def vince (Employee. "Vince" 42))

(def vincent (Employee. "Vincent" 42))

(def tony (Employee. "Tony" 2))

(into #{} [vince vincent tony])

但您可能希望追求“纯 Clojure”数据结构解决方案,而不是走散列码、equals、Java 互操作之路。

关于java - 在java中覆盖 "equals"的clojure等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7676794/

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