Среда: Ubuntu x86_64 (14.10), Oracle JDK 1.8u25
Я пытаюсь использовать параллельный поток Files.lines()
, но я хочу .skip()
в первой строке (это файл CSV с заголовком). Поэтому я стараюсь и делаю это:
try (
final Stream<String> stream = Files.lines(thePath, StandardCharsets.UTF_8)
.skip(1L).parallel();
) {
// etc
}
Но тогда один столбец не смог проанализировать int...
Итак, я попробовал простой код. Вопрос в файле прост:
$ cat info.csv
startDate;treeDepth;nrMatchers;nrLines;nrChars;nrCodePoints;nrNodes
1422758875023;34;54;151;4375;4375;27486
$
И код одинаково прост:
public static void main(final String... args)
{
final Path path = Paths.get("/home/fge/tmp/dd/info.csv");
Files.lines(path, StandardCharsets.UTF_8).skip(1L).parallel()
.forEach(System.out::println);
}
И я систематически получаю следующий результат (ОК, я только запускаю его примерно 20 раз):
startDate;treeDepth;nrMatchers;nrLines;nrChars;nrCodePoints;nrNodes
Что мне здесь не хватает?
РЕДАКТИРОВАТЬ Кажется, что проблема или недоразумение гораздо более укоренились, чем это (два примера, приведенные ниже, были приготовлены человеком на FreeNode ## java):
public static void main(final String... args)
{
new BufferedReader(new StringReader("Hello\nWorld")).lines()
.skip(1L).parallel()
.forEach(System.out::println);
final Iterator<String> iter
= Arrays.asList("Hello", "World").iterator();
final Spliterator<String> spliterator
= Spliterators.spliteratorUnknownSize(iter, Spliterator.ORDERED);
final Stream<String> s
= StreamSupport.stream(spliterator, true);
s.skip(1L).forEach(System.out::println);
}
Отпечатки:
Hello
Hello
Э.
@Holger предположил, что это происходит для любого потока, который ORDERED
, а не SIZED
с этим другим образцом:
Stream.of("Hello", "World")
.filter(x -> true)
.parallel()
.skip(1L)
.forEach(System.out::println);
Кроме того, это связано со всем обсуждением, которое уже имело место, что проблема (если она одна?) имеет .forEach()
(поскольку @SotiriosDelimanolis впервые указал).