当前位置: 首页 > 面试题库 >

这是Files.lines()中的错误,还是我对并行流有误解?

慕乐池
2023-03-14
问题内容

环境: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);
}

打印:

Hello
Hello

@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看来现在的实现确实表现出了更直观的行为。



 类似资料:
  • 环境:Ubuntu x86_64(14.10),Oracle JDK 1.8u25 我尝试使用并行流的,但我想的第一行(它是一个CSV文件的头)。因此我试着这样做: 但有一列无法解析为int。。。 所以我尝试了一些简单的代码。这个问题非常简单: 代码同样简单: 我系统地得到了以下结果(好的,我只运行了大约20次): 我错过了什么? 编辑似乎问题或误解的根源远不止于此(下面的两个例子是FreeNod

  • 为什么当我添加一个语义谓词(虽然这里是一个虚拟谓词)作为替代选项时,它总是说“第1行:5在输入' '处没有可行的替代选项”?如果我删除带有false语义谓词的替代选项,错误就会像预期的那样消失。 PS:我使用的是antlr-4.0-complete.jar

  • 问题内容: 我注意到了一些意外的行为(相对于我的个人期望而言是意外的),我想知道是否是JVM中存在错误,或者这可能是一种边缘情况,在这种情况下我不了解某些确切的细节应该发生。假设我们自己在main方法中具有以下代码: 天真的期望是这样会印刷,最大的甚至可以代表。但是,我认为整数算术应该在Java中“翻转”,因此将1加到会导致。由于仍小于,因此循环将循环遍历负数甚至整数。最终它将回到0,并且此过程应

  • 问题内容: 我收到错误org.json.JSONException:PROJECT_NAME没有值,这是我的json 鳕鱼是: 有什么办法可以找到密钥,如果密钥不存在,那么np需要获取特定字符串的值帮我谢谢 问题答案: 使用 具有 检查重点是存在于JSON。如果该对象具有名称映射,则返回true。 喜欢 另一种方法是使用 optString ,如果存在则返回按名称映射的值,并在必要时进行强制。如果

  • 此代码为-O1和-O2提供不同的结果: 那么这是一个错误吗?或者其中是否存在某种未定义的行为,编译器有权为其提供不同的结果? 据我从C99标准中可以看出,遍历所有值的循环是有效的,因为最大无符号整数值的增量被很好地定义为导致零。 涉及无符号操作数的计算永远不会溢出,因为不能由结果无符号整数类型表示的结果将被减少为比结果类型可以表示的最大值大一的数的模。

  • 我已经从http://hayageek.com/login-with-google-plus-javascript-api/ 我已经使用我的client_id,api密钥实现了代码,并且还遵循了Google oauth2中invalid_client的说明,但仍然收到相同的错误。 也在OAuth同意屏幕中并提及产品名称和电子邮件地址 错误:无效_client 应用程序:Project_Name 您