试图理解以下语句的完整含义 Stream.of(bufferedReader.readLine().replaceAll("\\s$", "")

Bra*_*ain 5 java java-stream

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

如果我错了,请纠正我

  • Stream:用于集合进行迭代。

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

  • replaceAll:正在替换空间,,稍后它会解析为 Integer 并被收集到 List 中

我的疑问是当我输入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
Run Code Online (Sandbox Code Playgroud)

Pol*_*ome 8

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

然后你就完成了。

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

  • `trim()` 并不相同,因为它会删除多个空白字符(如果存在),并且还会删除开头*和*结尾。另一方面,无论如何,`split(" ")`都会忽略末尾的空字符串,因此如果所讨论的空白是空格字符,则`replaceAll`就完全过时了。如果所讨论的空白不是空格字符,仍然可以让 `split` 处理它,例如通过 `.split(" |\\s$")`。无论哪种情况,都不需要两次字符串操作...... (2认同)