【问题标题】:Better method for writing out text line by line using Java Stream API?使用 Java Stream API 逐行写出文本的更好方法?
【发布时间】:2019-06-05 07:41:15
【问题描述】:

我想使用 Java Stream API 将文本行列表写入 csv。但是,我可以构建并过滤掉需要写入写入器流的行。但是我使用 CSVWriter 写行的部分并不是很流式的。我应该如何重写代码?

import au.com.bytecode.opencsv.CSVWriter;

public static void export(List<List<String>> data, Writer w) throws Exception{

    CSVWriter writer = new CSVWriter(w);    

    Stream.of(data)
        .filter(CollectionUtils::isNotEmpty)
        .forEach(row -> {
            writer.writeNext(row.toArray(new String[row.size()]));
        });

    w.flush();
}

【问题讨论】:

  • 你的意思是Stream.of(data)?那是Stream&lt;List&lt;List&lt;String&gt;&gt;
  • 另外,这里不要关闭w,因为这里没有打开。关闭事物应该(几乎)始终是打开它们的代码的责任。也许您打算使用writer.flush() 之类的东西?

标签: java java-stream export-to-csv


【解决方案1】:

也许这样的事情会更“流畅”:

data.stream()
     .filter(CollectionUtils::isNotEmpty)
     .map(row -> row.toArray(new String[row.size()]))
     .forEach(writer::writeNext);

老实说,我会使用 for 循环。

for (List<String> row : data) {
  if (Collections.isEmpty(row)) continue;
  writer.write(row.toArray(new String[row.size()]));
}

【讨论】:

  • use row.toArray(new String[0]) 以提高性能,同时甚至简化代码。并使用 row.isEmpty() 而不是漂亮的第 3 方方法。如果列表包含null 元素,负责的开发人员应该将异常抛到他们面前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
  • 2014-09-23
  • 1970-01-01
  • 2020-07-22
相关资源
最近更新 更多