在插入元素时尝试抛出异常,需要遍历地图中所有现有元素来验证它们是否可以与您要插入的元素进行比较,这对性能和可扩展性非常不利。同样,在您引发比较并把它转换为 `nil` 时捕获异常,会增加不必要的工作负担,这会对正确使用地图的每次操作造成浪费。这不是 Clojure 中唯一的例子,你需要理解涉及到的数据结构的实际契约,并正确使用它们,否则可能会得到意料之外的输出,损害性能。(更不用说为了添加这些功能,还需要特殊的针对 Clojure 的 Java 类实现。)
在此情况下,涉及到的数据结构是 Java 的 `SortedMap` 接口。以下是 Java 文档第二段的内容:
所有插入到排序映射中的键必须实现 `Comparable` 接口(或被指定的比较器接受)。此外,所有此类键必须可以相互比较:`k1.compareTo(k2)`(或 `comparator.compare(k1, k2)`)对于排序映射中的任何键 `k1` 和 `k2` 都不能抛出 `ClassCastException`。试图违反此限制将导致引发引发问题的方法或构造函数调用抛出 `ClassCastException`。
随着你对 JVM Clojure 的深入了解,你不可避免地需要了解它所基于和交互操作的那些 Java 类库的详细信息。话虽如此,链接到这个 Java 文档,以及可能将其总结或翻译成 Clojure 术语,在 Clojure 文档字符串中可能是有用的。