2014-01-17 3 views
0

Я унаследовал некоторый Java код, который выполняет следующие действия:Clojure изменить LazySeq

1) он получает от Clojure LazySeq объект (который состоит из ряда объектов PersistentHashMap)

2) она передает этот же объект LazySeq (без изменений) возвращается к сценарию Clojure, где он преобразуется в строку и передается обратно на Java

Проблема заключается в том, что внутри кода Java после этапа (1) и до этапа (2) мне нужно для изменения некоторых объектов PersistentHashMap внутри LazySeq, а затем перейдите к шагу (2). Что-то вроде:

LazySeq seq = clojureFunctionReturningLazySeq();

//update the elements of the sequence

String result = clojureFunctionReceivingLazySeq(seq);

Я не могу изменить сценарий Clojure себя и обновление LazySeq должно произойти внутри кода Java. Я проверил API LazySeq, и я не могу найти способ изменения (или добавления) элемента.

Спасибо,

Криса

+0

Вы можете рассматривать его как итерируемую коллекцию. –

+0

LazySeq и PersistentHashMap являются неизменными - по сути, вам нужно будет создать новую последовательность, основанную на содержимом того, который вы передали. Для Java это будет нетривиальная работа. – Alex

+0

@Alex Это тривиально, например, превратите его в ArrayList (конструктор ArrayList берет коллекцию), мутируйте ArrayList по желанию и возвращайте ArrayList, предполагая, что для получающего кода Clojure требуется только коллекция. –

ответ

0

Короткий ответ: Вы не можете. LazySeq и PersistentHashMap в Clojure неизменяемы.

Более длинный ответ: Вообще, Clojure код делает очень мало предположений о точном виде объекта списка он принимающий - Большинство вещей работают против ISeq, которые, если вы не хотите возиться с другими типами Clojure, достаточно тривиально реализовать.

Итак, вам нужно создать класс, который реализует ISeq и возвращает преобразованный PersistentHashMap, поскольку он проходит через его родителя LazySeq. Создайте этот класс и передайте его вместо clojureFunctionReceivingLazySeq(seq).