有没有一种方法可以直接在Kawa中循环遍历Java Iterable,或者在java.util.Iterator上循环循环

时间:2019-01-08 21:15:19

标签: java scheme lisp kawa

我还没有找到使用Java互操作直接在Kawa(方案)中循环遍历Java java.lang.Iterable或java.util.Iterator的方法

我可以先使用Java java.lang.Iterable,再使用java.util.Iterator,然后使用名为let的递归遍历项目:

((define blkaccessor::java.lang.Iterable (bfaccessor:getHeaderAccessor))
(define blkaccitr::java.util.Iterator (blkaccessor:iterator))
(let        loop    ((block-item::JDataBlockItemData (blkaccitr:next)))
             (when (blkaccitr:hasNext)
                (display &{&[block-item:name] = &[block-item:value]
})
                (loop (blkaccitr:next))
            )
)

代码运行并列出REPL中的所有项目,但是必须有一种直接在Iterable或Iterator上循环的方法。

注意:我刚刚意识到我的递归“ let”是完全错误的(如果迭代器hasNext方法在输入时返回false,它将失败,因为我通过调用next而不检查hasNext来初始化块项首先,它不会打印所有项目),但是这部分代码对于回答该问题不是必不可少的,并且可以修复(我的时间不多了,但明天我将尝试更新代码)。
起点和基本代码是我获得Iterable然后获得Iterator的前两行。

1 个答案:

答案 0 :(得分:1)

看起来“ map”和“ for-each”应该能够在迭代器上进行迭代:https://gitlab.com/kashell/Kawa/commit/9428041dca2d262edc3a5ab781e1302f33e279a1

没有更多(或更少)细节就无法复制您的代码,但是以下是Java字符串数组上的迭代示例:

(let ((java-string-array (String[] "aaa" "bb" "c")))
  (for-each (lambda (string) (write string))
            java-string-array))