2014-01-17 24 views
0

我繼承一些Java代碼,執行以下操作:Clojure的修改LazySeq

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,並找不到修改(或添加)元素的方法。

謝謝

克里斯

+0

你可以把它當成一個可迭代的集合。 –

+0

LazySeq和PersistentHashMap都是不可變的 - 實質上,您需要做的是根據傳遞的內容構建一個新的序列。在Java中執行此操作將是一項不重要的工作。 – Alex

+0

@Alex對於例如把它變成一個ArrayList(ArrayList構造函數需要一個Collection),隨意改變ArrayList,並提供ArrayList,假設接收的Clojure代碼只需要一個Collection。 –

回答

0

簡短的回答:你不能。 Clojure中的LazySeqPersistentHashMap是不可變的。

較長的答案:一般來說,Clojure的代碼做出了有關的確切類型列表對象的它的接收非常少的假設 - 大部分事情對ISeq,如果你不希望與其他Clojure的類型來打擾工作,是相當微不足道的實施。

因此,您需要創建一個實現ISeq的類,並返回已轉換的PersistentHashMap,因爲它運行的是其父代LazySeq。實例化該類並將其傳遞給clojureFunctionReceivingLazySeq(seq)