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
# 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 楼答案
你说
.replaceAll("\\s$", "")
用逗号替换空格,但它不是这样做的。它会将字符串末尾出现的所有空格替换为零。(
\s
表示任何空格,$
表示字符串结尾)在此之后,字符串被拆分为一个数组,分隔符是一个空格:“”。然后将所有单元格解析为整数并收集为列表
替换似乎有点奇怪,但我不能在不了解上下文的情况下说是否有必要。看起来trim更合适