当前位置: 首页 > 知识库问答 >
问题:

Java迭代代码上的Clojure lazy-seq

戴原
2023-03-14

我试图从继承的一些迭代Java库代码中创建一个Clojure seq。基本上,Java代码所做的是使用解析器从文件中读取记录,将这些记录发送到处理器,并返回结果的ArrayList。在Java中,这是通过调用parser.readdata(),然后调用parser.getRecord()获取一条记录,然后将该记录传递给processor.processRecord()来完成的。对parser.readdata()的每次调用返回一条记录,如果没有更多记录,则返回null。Java中非常常见的模式。

(defn next-record
  "Get the next record from the parser and process it."
  [parser processor]
  (let [datamap (.readData parser)
        row (.getRecord parser datamap)]
    (if (nil? row)
    nil
    (.processRecord processor row 100))))
(defn datamap-seq
  "Returns a lazy seq of the records using the given parser and processor"
  [parser processor]
  (lazy-seq
    (when-let [records (next-record parser processor)]
      (cons records (datamap-seq parser processor)))))

我可以创建一个解析器和处理器,并执行类似的操作(例如5(datamap-seq parser processor))。正如预期的那样,获取(第一个)seq只实现了一个元素,执行计数实现了所有元素,等等,这就是我希望从一个懒惰的seq中得到的行为。

当然,当有很多记录时,我最终得到一个StackOverflowException。所以我的下一个尝试是使用loop-recur来做同样的事情。

(defn datamap-seq
  "Returns a lazy seq of the records using the given parser and processor"
  [parser processor]
  (lazy-seq
    (loop [records (seq '())]
      (if-let [record (next-record parser processor)]
        (recur (cons record records))
        records))))

现在,以同样的方式使用它,并使用(def results(datamap-seq parser processor))对它进行def deq(datamap-seq parser processor))给出了一个惰性seq,并且没有实现然而,一旦我做了其他任何事情,比如(第一个结果),它就强制实现整个SEQ。

我仔细查看了异常的堆栈跟踪,其中一个Java类抛出了堆栈溢出异常。但只有当我有这样的datamap-seq函数时才会发生这种情况(我上面发布的函数确实有效):

(defn datamap-seq
  "Returns a lazy seq of the records using the given parser and processor"
  [parser processor]
  (lazy-seq
    (when-let [records (next-record parser processor)]
      (cons records (remove empty? (datamap-seq parser processor))))))

我真的不明白为什么删除会导致问题,但当我从这个功能中删除它时,一切都正常(我现在正在其他地方删除空列表)。

共有1个答案

施飞昂
2023-03-14

循环/重复循环在循环表达式中循环,直到递归用完。在它周围添加一个lazy-seq并不能阻止这一点。

您第一次尝试使用lazy-seq/cons应该已经按照您的要求工作,不会出现堆栈溢出。我现在还不能确定它的问题是什么,尽管它可能在代码的java部分。

 类似资料:
  • 问题内容: 我有两个哈希图 每个哈希图都有不同的键和值。我试图同时遍历两个哈希图,并乘以每个值 最简单快捷的方法是什么?我在两个哈希图中都有数千个值。 谢谢 问题答案: 您可能做错了… 首先,HashMap无法存储整数,它需要适当的对象-如整数-数组是一个对象,尽管它隐藏在某些语法糖的后面。 如果它们恰好具有相同的大小,这是循环遍历这两个地图的方法,我想这就是您的意思。 但是您可能应该回过头来重新

  • 让我们使用函数创建一个 3X4 数组,并使用nditer对它进行迭代。 输出如下: 原始数组是: [[ 0 5 10 15] [20 25 30 35] [40 45 50 55]] 修改后的数组是: 0 5 10 15 20 25 30 35 40 45 50 55 示例 2 迭代的顺序匹配数组的内容布局,而不考虑特定的排序。 这可以通过迭代上述数组的转置来看到。 import numpy

  • 问题内容: 什么是迭代器和集合?这两个有关系吗? 接口迭代器是否只预定义了这些方法名称,还是用户定义了这些方法名称?下面的这四行实际上说明了什么? 谢谢。我正在看一本藏书。 问题答案: 顾名思义,Java集合是事物的集合。如果您不知道该单词,请在字典中查找。 有很多类型的集合。以集合的数学概念为例。您可以将任意事物放入集合中,但是永远不会包含同一事物。在集中的东西是没有顺序的,那就是你不能说 A

  • 问题内容: 我正在编写一个递归函数,其目的是迭代pList文件。我的代码是 但是当我调用函数“ HashMapper((Map)((Map)entry).keySet());”时。我有一个例外 java.util.HashMap $ HashMap条目不能转换为java.util.Map 我不知道如何调用函数以及如何将Hashmap条目转换为Map 问题答案: 入境确实不是。它是,因此您可以根据需

  • 你竟任着刚硬不悔改的心,为自己积蓄忿怒,以致神震怒,显他公义审判的日子来到。他必照各人的行为报应各人。凡恒心行善,寻求荣耀、尊贵和不能朽坏之福的,就以永生报应他们;惟有结党不顺从真理,反顺从不义的,就以忿怒、恼恨报应他们。(ROMANS 2:7-8) 迭代 Bill正在介绍他的项目,嘴里不断蹦出“loop、iterate、traversal、recursion”这些单词,夹杂在汉语汇总。旁边的小白

  • 什么叫做迭代? 比如在 Java 中,我们通过 List 集合的下标来遍历 List 集合中的元素,在 Python 中,给定一个 list 或 tuple,我们可以通过 for 循环来遍历这个 list 或 tuple ,这种遍历就是迭代。 可是,Python 的 for 循环抽象程度要高于 Java 的 for 循环的,为什么这么说呢?因为 Python 的 for 循环不仅可以用在 list