这是Files.lines()中的错误,还是我对并行流有误解?
环境: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
}
但是随后一列无法解析为一个整数…
所以我尝试了一些简单的代码。文件问题很简单:
$ 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);
}
打印:
HelloHello
嗯
@Holger认为发生这种情况对于其是任何流ORDERED
,而不是SIZED
与该其他样本:
Stream.of("Hello", "World") .filter(x -> true)
.parallel()
.skip(1L)
.forEach(System.out::println);
同样,它源于已经进行的所有讨论,即问题是否存在.forEach()
。
回答:
由于问题的当前状态与此处先前的陈述完全相反,因此应注意,BrianGoetz现在有明确声明,将无序特征反向传播到skip
操作之后被视为错误。还指出,现在认为它根本不对终端操作的有序性进行反向传播。
还有一个相关的错误报告JDK-8129120,其状态为“已在Java
9中修复”,并且已反向移植到Java
8,更新为60
我进行了一些测试,jdk1.8.0_60
看来现在的实现确实表现出了更直观的行为。
以上是 这是Files.lines()中的错误,还是我对并行流有误解? 的全部内容, 来源链接: utcz.com/qa/428126.html