mik*_*era 11 arrays reflection clojure primitive-types
在Clojure中检测对象是否是Java原始数组的最佳方法是什么?
我需要这个的原因是对原始数组做一些特殊的处理,它可能看起来像:
(if (byte-array? object)
(handle-byte-array object))
Run Code Online (Sandbox Code Playgroud)
它是一个相当性能敏感的代码片段,所以我宁愿避免反思,如果可能的话.
Art*_*ldt 10
您可以使用反射一次从名称中获取类,缓存它,然后将其余部分与之进行比较
(def array-of-ints-type (Class/forName "[I"))
(def array-of-bytes-type (Class/forName "[B"))
...
(= (type (into-array Integer/TYPE [1 3 4])) array-of-ints-type)
true
Run Code Online (Sandbox Code Playgroud)
(defn primitive-array? [o]
(let [c (class o)]
(and (.isArray c)
(.. c getComponentType isPrimitive))))
Run Code Online (Sandbox Code Playgroud)
对于特定情况,您可以使用以下内容:
(defn long-array? [o]
(let [c (class o)]
(and (.isArray c)
(identical? (.getComponentType c) Long/TYPE))))
Run Code Online (Sandbox Code Playgroud)
小智 6
要在不使用反射的情况下检查字节数组,可以执行以下操作:
(def ^:const byte-array-type (type (byte-array 0)))
(defn bytes? [x] (= (type x) byte-array-type))
Run Code Online (Sandbox Code Playgroud)
不完全确定原因,但你甚至可以内联字节数组类型^:const.
小智 5
正如Arthur Ulfeldt指出的那样,你可以使用Class/forName,例如,像这里:
(def byte_array_class (Class/forName "[B"))
(defn byte-array? [arr] (instance? byte_array_class arr))
Run Code Online (Sandbox Code Playgroud)
如果要"[B"在缓存类时避免使用魔术字符串,可以应用于class现有的数组对象:
(def byte_array_class (class (byte-array [])))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2272 次 |
| 最近记录: |