我正在添加屏幕截图以获取更多信息。我是 Java8 的新手,如果我问的问题不好,请原谅我。当我研究空格分隔值的输入时,我得到了这个陈述。我知道下面的语句将值作为1 2 3值并将值[1, 2, 3]作为列表返回。
如果我错了,请纠正我
Stream:用于集合进行迭代。
bufferedReader.readLine():它将行读取为字符串
,稍后它会解析为 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)
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::parseIntStream<Integer>#collect(toList())取 aString<Integer>并将其收集到 aList<Integer>List<Integer> a = ... 将上述步骤的结果分配给变量 a然后你就完成了。
您在使用时看到的逗号是System.out.println(a)通过调用List#toString()(实际上AbstractCollection#toString是 ,大多数 List 实现通过 继承Abstractlist)产生的,它产生一个逗号分隔的值列表,用方括号括起来。这是一个字符串表示,便于我们人类阅读,与列表的内部存储方式无关。在一个ArrayList例如,内部存储将是Integer[],其他列表实现使用其他数据结构。一些调试器类似地将列表和数组的内容显示为逗号分隔的列表——这再次纯粹是为了更容易阅读。