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

标签 java java-stream

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

如果我错了,请纠正我

  • 流:用于集合进行迭代。
  • bufferedReader.readLine():它将行读取为字符串
  • replaceAll:正在用 , 替换空间稍后它被解析为 Integer 并被收集到 List

  • 我的疑问是当我输入 1 2 3这是一个字符串。那么,这个流是先用空间分割值然后迭代分割值吗?还是第一次解析值,然后将值存储在列表中,稍后将值与空格分开并删除空格并替换为 , .我很好奇,下面的语句究竟是如何工作的。
    List<Integer> a = Stream.of(bufferedReader.readLine().replaceAll("\\s$", "").split(" "))
                    .map(Integer::parseInt)
                    .collect(toList());
    
    
      [1]: /image/nlXxd.jpg
    

    最佳答案

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

  • 然后你就完成了。

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

    关于java - 试图理解以下语句的完整含义 Stream.of(bufferedReader.readLine().replaceAll ("\\s$", ""),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62409119/

    相关文章:

    java - 添加嵌套 View 会动态卡住应用程序

    java - 一个 Action 的多个 Java 消费者

    java - 使用 Java lambda 表达式从 Map 中获取特定条目及其索引

    Java 8流 "Cannot use this in a static context"

    java - 使用 Java 8 Stream 替换 for 循环并填充 Map

    Java:类问题。 Java新手

    java - java中如何判断数组列表是否为空?

    java - JPA - 将实体映射到sql查询?

    java-8 - 为什么需要在管道中进行短路操作...在 Java 8 中

    java - 避免 Java 8 流中的 NoSuchElementException