System.out.println не работает с предоставленным потоком? - PullRequest
0 голосов
/ 06 августа 2020

Я все еще новичок в Java и особенно новичок в поставщиках, но я не могу понять, почему я не могу получить какой-либо вывод из следующего кода:

final BufferedReader brLines = new BufferedReader(new InputStreamReader(csvFile));
final Supplier<Stream<LinkedList<String>>> procLines = () -> brLines.lines().map(elm -> processCSV(elm));

lineCount = Math.toIntExact(procLines.get().count());

System.out.println(lineCount); // This prints the correct amount of lines to the console.

final CountDownLatch latch = new CountDownLatch(lineCount);

Stream<LinkedList<String>> listStream = procLines.get();
listStream.forEach((x) -> {
    System.out.println(x); // Why is there no console output here?
    outputText(() -> x); // Why is there no console output here either?

    ...
});

Вот некоторые из методов, упомянутых в этом блоке

public static LinkedList<String> processCSV(String line) {  
    LinkedList<String> elms = new LinkedList<String>();
    char delimiter = ',';
    char quote = '"';

    String[] elmArray = splitCSVWithQuote(line, delimiter, quote).toArray(new String[0]);

    for (String elm : elmArray) {
        elms.add(elm);
    }

    return elms;
}

&

public static void outputText(Supplier sup) {
    System.out.println(sup.get());
}

Может ли кто-нибудь помочь?

1 Ответ

1 голос
/ 06 августа 2020
lineCount = Math.toIntExact(procLines.get().count());

count() - это терминальная операция, она может перемещаться по потоку для получения результата. После выполнения терминальной операции конвейер потока считается использованным и больше не может использоваться.

Итак, вы использовали все строки файла. Таким образом, поставщик не может снова предоставить вам поток, поскольку BufferedReader теперь находится в конце потока. Вот почему нет вывода.

...