Запись данных в файл .CSV с использованием потока Java 8 - PullRequest
2 голосов
/ 05 августа 2020

Я пытаюсь вывести 2 коллекции данных в файл .csv в Java.

Коллекция 1 = имена клиентов Коллекция 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

Как я могу достичь желаемого результата?

Ответы [ 4 ]

2 голосов
/ 05 августа 2020

Вы можете сделать это, если оба списка имеют одинаковый размер. Используйте IntStream.range, чтобы перебирать списки и затем отображать данные. Затем собираем присоединение ,\n

String res = IntStream.range(0, customers.size())
                      .mapToObj(i -> customers.get(i) + ":" + references.get(i))
                      .collect(Collectors.joining(",\n"));
1 голос
/ 05 августа 2020

Предполагая, что обе ваши коллекции имеют одинаковое количество элементов, вы можете попробовать это

String output =
        IntStream.rangeClosed(0, customers.size()-1)
            .boxed()
            .map(i -> customers.get(i) + ":" + references.get(i))
            .collect(Collectors.joining("\n"));
writer.write(output);
1 голос
/ 05 августа 2020

Я предполагаю, что 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());

0 голосов
/ 05 августа 2020

То, что вы пытаетесь сделать, называется архивированием коллекции.

См. полную статью здесь

В чистом виде 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"));
...