如何从符合我条件的流中选择几行以流为起点?

时间:2019-05-17 13:24:01

标签: java java-8

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

您可以组合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