使用 Java 8 流将数据写入 .CSV 文件

Writing data to a .CSV file using a Java 8 Stream

我正在尝试将 2 collections 数据输出到 Java 中的 .csv 文件。

Collection 1 = 客户名称 Collection 2 = 客户推荐

我希望 .csv 显示为:

Smith:839393,
Johnson:283940,
Collins:293845

我的代码:

private void writeDataToFile() throws IOException {

    FileWriter writer = new FileWriter("src/test/resources/custData.csv");

    List<String> customers = new ArrayList<>(customers);
    List<String> references = new ArrayList<>(references);

    String collect1 = customers.stream().collect(Collectors.joining(",\n" + ":"));
    String collect2 = references.stream().collect(Collectors.joining(",\n" + ":"));

    writer.write(collect1 + collect2);
    writer.close();

}

我的输出:

Smith,
:Johnson,
:Collins839393,
:283940,
:293845

我怎样才能达到预期的输出?

如果两个列表的大小相同,您可以这样做。使用 IntStream.range 迭代列表,然后映射数据。然后收藏加入,\n

String res = IntStream.range(0, customers.size())
                      .mapToObj(i -> customers.get(i) + ":" + references.get(i))
                      .collect(Collectors.joining(",\n"));

我假设 customersreferences 大小相同。您可以在 0 和 customers.size() 之间迭代并组合两个列表的元素:

customers.get(i) + ":" + references.get(i) + ",\n"

试试这个:

String output = IntStream.range(0, customers.size()).boxed()
        .map(i -> customers.get(i) + ":" + references.get(i) + ",\n").collect(Collectors.joining());

假设您的两个集合具有相同数量的元素,您可以试试这个

String output =
        IntStream.rangeClosed(0, customers.size()-1)
            .boxed()
            .map(i -> customers.get(i) + ":" + references.get(i))
            .collect(Collectors.joining("\n"));
writer.write(output);

您尝试执行的操作称为集合压缩。

full article here

纯java你可以做解决方案

IntStream.range(0, Math.min(customers.size(), references.size()))
         .mapToObj(i -> customers.get(i) + ":" + references.get(i))
         .collect(Collectors.joining(",\n"));

如果你有番石榴,你可以做得更好

Streams
    .zip(customers.stream(), references.stream(), (customer, reference) -> customer + ":" + reference)
    .collect(Collectors.joining(",\n"));