使用 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"));
我假设 customers
和 references
大小相同。您可以在 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);
您尝试执行的操作称为集合压缩。
纯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"));
我正在尝试将 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"));
我假设 customers
和 references
大小相同。您可以在 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);
您尝试执行的操作称为集合压缩。
纯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"));