【问题标题】:How to select few lines with Streams staring from one which matches my condition? [closed]如何选择几行,Streams 从符合我的条件的一行开始? [关闭]
【发布时间】:2019-05-17 13:24:00
【问题描述】:

我对使用流还很陌生,我想尝试用它们解析配置文件。

我有这样的文件设置...

[Category 1]
1 2 3 4
5 6 7 8

[Category 2]
9 8 7 6
5 4 3 2

我将如何使用 Streams 从这些类别之一中获取所有行?有没有使用 Streams 的干净方法?

【问题讨论】:

  • 似乎只使用循环会更简单
  • 我同意,但我想看看有没有办法用 Streams 做到这一点。我不知道为什么这个问题有这么多反对票。用一个例子说“是”或只是“不”似乎并不难。
  • 投反对票的原因是缺乏您的研究证据或试图解决问题。
  • 恕我直言,当订单很重要时,应避免使用流。当您需要过滤/映射/收集序列无关紧要的集合时,流很方便。读取文件通常必须逐行按顺序完成。此外,行号通常很有用。由于这些原因,Stream 在这个用例中似乎不是一个好主意。

标签: java java-8


【解决方案1】:

您可以结合使用 Java 9 中引入的 dropWhiletakeWhile 方法。如果您正在搜索让我们说 [Category 2] 删除它之前的所有行,并继续处理所有行直到找到空行(或直到流将结束,但这种情况会自动覆盖)。

演示(有关split("\\R") 的更多信息,请参阅https://stackoverflow.com/a/31060125):

String data =
        "[Category 1]\n" +
        "1 2 3 4\n" +
        "5 6 7 8\n" +
        "\n" +
        "[Category 2]\n" +
        "9 8 7 6\n" +
        "5 4 3 2\n" +
        "\n" +
        "[Category 3]\n" +
        "1 3 7 6\n" +
        "4 4 3 2\n";

Stream.of(data.split("\\R"))  // form Java 8 regex engine supports \R as line separator
      .dropWhile(line->!line.equals("[Category 2]"))
      .takeWhile(Predicate.not(String::isEmpty))
      .forEach(System.out::println);

输出:

[Category 2]
9 8 7 6
5 4 3 2

【讨论】:

  • 这正是我需要的,谢谢!它涵盖了我的许多子问题。
猜你喜欢
  • 2019-09-05
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 2020-08-06
相关资源
最近更新 更多