Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java翻译为Clojure-附加到列表并返回列表_Java_Clojure_Functional Programming - Fatal编程技术网

将Java翻译为Clojure-附加到列表并返回列表

将Java翻译为Clojure-附加到列表并返回列表,java,clojure,functional-programming,Java,Clojure,Functional Programming,我想将以下java翻译成惯用的clojure: List<SimpleRecord> recs = new ArrayList<SimpleRecord>(); ParquetReader<SimpleRecord> reader = null; try { PrintWriter writer = new PrintWriter(Main.out, true); reader = new ParquetReader<Si

我想将以下java翻译成惯用的clojure:

List<SimpleRecord> recs = new ArrayList<SimpleRecord>();
ParquetReader<SimpleRecord> reader = null;
    try {
      PrintWriter writer = new PrintWriter(Main.out, true);
      reader = new ParquetReader<SimpleRecord>(new Path(input), new SimpleReadSupport());
      for (SimpleRecord value = reader.read(); value != null; value = reader.read()) {
        //value.prettyPrint(writer);
        //writer.println();
        recs.add(value);
      }
      return value;
    } finally {
      if (reader != null) {
        try {
          reader.close();
        } catch (Exception ex) {
        }
      }
    }

但我不知道在一个小时内做这件事的惯用方法是什么。我猜我必须使用reduce no?谢谢

我对拼花地板一无所知,也不知道你在做什么,以下是我的最佳猜测和一些观察结果:

(with-open [reader (parquet.hadoop.ParquetReader. 
                     (org.apache.hadoop.fs.Path. "file.pq") 
                     (SimpleReadSupport.))]
  (doall (for [value (repeatedly #(.read reader))
               :while value] 
           value))
零和假都是虚假的,其他一切都是真实的,如果价值从来都不是虚假的,那么就用价值代替非零?价值额外的问题:布尔值。虚假是真实的,请看:

它需要是向量吗,为什么?这里的代码返回一个seq,它由doall提前实现,并在with open中限定范围,相当于您的try finally

Clojure的数据是不可变的,您不需要附加到列表,而是告诉它从旧数据创建一个新数据,并让Clojure处理细节:-。在代码示例中,您无法更改行的值。一旦设置了行的值,就没有“变量”。有可变的引用类型,但是在这里使用它们是不好的。从技术上讲,您可以使用loop/recur来实现这一点,但是没有理由在这里讨论性能问题,并且通常使用惰性序列方法有真正的好处

reduce不起作用,因为它消除了提前退出的能力,而且这里的输入是一个java对象,reduce需要一个seq-able对象,所以您仍然需要找到一些方法来生成一个延迟序列,然后您就回到了原点

因为这不是一个循环,而是一个列表。它生成一个惰性的值序列

我不认为新的习惯用法,我不知道为什么:不过,对于使用宏生成代码来说,这是一个更好的选择


花点时间去理解这些概念,它们在实践中非常棒

我对拼花地板一无所知,也不知道你想做什么,以下是我最好的猜测和一些观察结果:

(with-open [reader (parquet.hadoop.ParquetReader. 
                     (org.apache.hadoop.fs.Path. "file.pq") 
                     (SimpleReadSupport.))]
  (doall (for [value (repeatedly #(.read reader))
               :while value] 
           value))
零和假都是虚假的,其他一切都是真实的,如果价值从来都不是虚假的,那么就用价值代替非零?价值额外的问题:布尔值。虚假是真实的,请看:

它需要是向量吗,为什么?这里的代码返回一个seq,它由doall提前实现,并在with open中限定范围,相当于您的try finally

Clojure的数据是不可变的,您不需要附加到列表,而是告诉它从旧数据创建一个新数据,并让Clojure处理细节:-。在代码示例中,您无法更改行的值。一旦设置了行的值,就没有“变量”。有可变的引用类型,但是在这里使用它们是不好的。从技术上讲,您可以使用loop/recur来实现这一点,但是没有理由在这里讨论性能问题,并且通常使用惰性序列方法有真正的好处

reduce不起作用,因为它消除了提前退出的能力,而且这里的输入是一个java对象,reduce需要一个seq-able对象,所以您仍然需要找到一些方法来生成一个延迟序列,然后您就回到了原点

因为这不是一个循环,而是一个列表。它生成一个惰性的值序列

我不认为新的习惯用法,我不知道为什么:不过,对于使用宏生成代码来说,这是一个更好的选择

花点时间去理解这些概念,它们在实践中非常棒

因为在Clojure中不是for循环,而是序列理解

默认的Clojure数据结构是不可变的,应该以迭代方式构建,而不是在迭代中进行变异

(with-open [reader (parquet.hadoop.ParquetReader. 
                     (org.apache.hadoop.fs.Path. "file.pq") 
                     (SimpleReadSupport.))]
  (doall
   (take-while (complement nil?)
               (repeatedly (fn []
                             (try (.read reader)
                                  (catch Exception e))))))
因为在Clojure中,它不是for循环,而是序列理解

默认的Clojure数据结构是不可变的,应该以迭代方式构建,而不是在迭代中进行变异

(with-open [reader (parquet.hadoop.ParquetReader. 
                     (org.apache.hadoop.fs.Path. "file.pq") 
                     (SimpleReadSupport.))]
  (doall
   (take-while (complement nil?)
               (repeatedly (fn []
                             (try (.read reader)
                                  (catch Exception e))))))

gtrak的方法当然是最好的,但我仍然想向您展示如何在clojure中编写显式循环

(with-open [reader (parquet.hadoop.ParquetReader. 
                     (org.apache.hadoop.fs.Path. "file.pq") 
                     (SimpleReadSupport.))]
  (loop [rows []]
    (let [value (.read reader)]
      (if value
          (recur (conj rows value))
          rows))))

gtrak的方法当然是最好的,但我仍然想向您展示如何在clojure中编写显式循环

(with-open [reader (parquet.hadoop.ParquetReader. 
                     (org.apache.hadoop.fs.Path. "file.pq") 
                     (SimpleReadSupport.))]
  (loop [rows []]
    (let [value (.read reader)]
      (if value
          (recur (conj rows value))
          rows))))

正确使用行顺序:-谢谢我公然复制/粘贴了你对new/with open的删除:啊,我只是浏览了一下javadoc,ParquetReader没有扩展java.io.reader。可能会将此切换为使用iterate/take,但前提是他的基本情况一开始是正确的。如果格式化程序理解该符号,则会进行更新。很好地使用了line seq.:-谢谢我公然复制/粘贴了你对new/with open的删除:啊,我只是浏览了一下javadoc,ParquetReader没有扩展java.io.reader。可能会将其切换为使用iterate/take,而只是作为一种替代方案,假设他的基本情况一开始是正确的,如果只有格式化程序理解了notationreduce可以通过reduced提前退出,那就谢谢了。代码中不应该有重复出现的错误吗?read reader只返回一个值?我遇到了一个java.lang.IllegalArgumentException:不知道如何从以下内容创建ISeq:parquet.tools.read.SimpleRecord;除了我在序列中的所有元素
都一样!但谢谢你的详细解释。只要替换。反复阅读。阅读reader@SpiderPig编程很难:-reduce可以通过reduce提前退出。代码中不应该有重复的。read reader只返回一个值吗?我遇到了一个java.lang.IllegalArgumentException:不知道如何从以下位置创建ISeq:拼花地板.tools.read.SimpleRecord;此外,我在seq中的所有元素都是相同的!但谢谢你的详细解释。只要替换。反复阅读。阅读reader@SpiderPig编程很难:-