有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java试图理解下面语句流的完整含义。of(bufferedReader.readLine()。replaceAll(“\\s$”,“”)

我正在添加更多信息的屏幕截图。我是Java8新手,如果我问了一个糟糕的问题,请原谅我。当我在研究空间分隔值的输入时,我得到了这个结论。 我知道下面的语句将value作为1 2 3,并将value [1, 2, 3]作为列表返回

如果我错了,请纠正我

  • 流:用于迭代的集合

  • bufferedReader。readLine():它将该行读取为字符串

  • replaceAll:将空格替换为,之后,它将解析为整数并被收集到列表中

我的疑问是当我输入1 2 3时,这是一个字符串。那么,这个流是先用空间分割值,然后在分割的值上迭代吗?或者是先解析值,然后将值存储在列表中,然后用空格拆分值并删除空格,然后用,替换。我很好奇,下面的说法到底是怎么起作用的

List<Integer> a = Stream.of(bufferedReader.readLine().replaceAll("\\s$", "").split(" "))
                .map(Integer::parseInt)
                .collect(toList());


  [1]: https://i.stack.imgur.com/nlXxd.jpg

共 (2) 个答案

  1. # 1 楼答案

    • bufferedReader.readLine()读取一行,作为String。字符串没有分配给任何变量
    • replaceAll("\\s$", "")被锚定在行的末尾,并删除最后一个空格。使用String#trim会更好
    • split(" ")将字符串拆分为String[],在空白处将其拆分
    • Stream.of(String[])获取我们现在拥有的String[]并返回一个Stream<String>
    • Stream<String>.map(Function<String, Integer>)通过对流的每个元素应用映射函数(Integer::parseInt),将Stream<String>转换为Stream<Integer>
    • Stream<Integer>#collect(toList())获取String<Integer>并将其收集到List<Integer>
    • List<Integer> a = ...将上述步骤的结果赋给变量a

    然后你就完蛋了

    使用System.out.println(a)时看到的逗号是通过调用List#toString()(实际上是^{},大多数列表实现通过Abstractlist继承它)生成的,它生成一个逗号分隔的值列表,用方括号括起来。这是一种字符串表示,便于我们人类阅读,与列表的内部存储方式无关。例如,在ArrayList中,内部存储将是Integer[],其他列表实现使用其他数据结构。 一些调试器类似地将列表和数组的内容显示为逗号分隔的列表,这同样纯粹是为了更易于阅读

  2. # 2 楼答案

    你说

    .replaceAll("\\s$", "")

    用逗号替换空格,但它不是这样做的。它会将字符串末尾出现的所有空格替换为零。(\s表示任何空格,$表示字符串结尾)

    在此之后,字符串被拆分为一个数组,分隔符是一个空格:“”。然后将所有单元格解析为整数并收集为列表

    替换似乎有点奇怪,但我不能在不了解上下文的情况下说是否有必要。看起来trim更合适