【发布时间】:2016-07-11 15:04:25
【问题描述】:
我有一个要转换为不可变 Java POJO 的值列表。 Java POJO 是使用构建器模式生成的。
我的清单是:
[49.0 11.1 150.0]
在 Java 中,我的 POJO 会这样构造:
Position.builder().latitude(49.0).longitude(11.1).altitude(150.0).build()
我想在 Clojure 中创建它,我会首先 zipmap 包含需要使用的方法的值,然后我可以 reduce-kv 将所有内容设置为我需要的 Java 值:
(defn poslist->map [list]
(zipmap ['.latitude '.longitude '.altitude]
list))
(.build (reduce-kv #(%2 %1 %3)
(pkg.Position/builder)
(poslist->map list)))
我现在的问题是我没有得到我所期望的。函数poslist->map返回期望值:
{.latitude 49.0, .longitude 11.1, .altitude 150.0}
但reduce-kv 只返回我拥有的最后一个值:
150.0
我为什么不取回可以应用.build 方法的构建器?我曾期望 reduce-kv 与以下代码具有相同的结果,返回我所期望的:
(.build (.altitude (.longitude (.latitude (pkg.Position/builder) 150.0) 11.1) 49.0))
当 reduce-kv 函数返回一个 double 时,.build 的以下调用失败了
No matching field found: build for class java.lang.Double
顺便说一句:我将方法映射到列表值的原因是,我必须设置的实际字段列表比示例中的要长。我在保留基本问题的同时精简了示例以提高可读性。
【问题讨论】:
标签: clojure clojure-java-interop