【发布时间】:2014-01-17 18:49:27
【问题描述】:
我继承了一些执行以下操作的 Java 代码:
1) 它从 Clojure 接收一个 LazySeq 对象(由许多 PersistentHashMap 对象组成)
2) 然后它将同一个 LazySeq 对象(未更改)传递回 Clojure 脚本,在该脚本中将其转换为字符串并传递回 Java
问题是在步骤(1)之后和步骤(2)之前的 Java 代码中,我需要修改 LazySeq 中的一些 PersistentHashMap 对象,然后继续执行步骤(2)。比如:
LazySeq seq = clojureFunctionReturningLazySeq();
//update the elements of the sequence
String result = clojureFunctionReceivingLazySeq(seq);
我无法修改 Clojure 脚本本身,并且 LazySeq 的更新必须在 Java 代码中进行。我检查了 LazySeq API,但找不到修改(或添加)元素的方法。
谢谢,
克里斯
【问题讨论】:
-
你可以把它当作一个可迭代的集合。
-
LazySeq 和 PersistentHashMap 都是不可变的——本质上,您需要做的是根据您传递的内容构建一个新序列。在 Java 中完成这项工作将是一项不小的工作。
-
@Alex 这很简单,例如把它变成一个ArrayList(ArrayList构造函数接受一个Collection),随意变异ArrayList,并返回ArrayList,假设接收Clojure代码只需要一个Collection。
-
@A.Webb True,您可以类似地使用 HashMap 的复制构造函数来改变序列中的映射。但是很多惯用的 Clojure 代码如果在它期望持久映射的地方接收到原始映射,就会中断;在不了解 Clojure 代码的情况下,我不想做出任何此类假设。
-
@Alex 对。我更多地考虑改变集合而不是集合的内容。或者,使用
clojure.lang.RT来完成这项工作。