如何拆分流以不同方式处理元素?

时间:2017-11-09 11:43:16

标签: java java-8 java-stream

我正在使用这样的代码来处理由多行组成的文件:

BufferedReader reader = ...
reader.lines().forEach(Same common Action)

只要需要以相同的方式处理每一行,这都可以正常工作。但有时可能会有几种不同的行为。

例如,假设第一行是标题,其他行是内容。对于我要执行的第一行Action1,以及我想要Action2的其他人。

在Java 7风格中,我会做这样的事情:

String line;
boolean first = true;
while ( (line = reader.readLine()) != null) {
    if (first) {
        action1(line);
        first = false;
    } else {
        action2(line);
    }
}

但这很复杂而且丑陋,根本就没有使用流。我怎么能用Java 8流以惯用的方式做到这一点?

3 个答案:

答案 0 :(得分:21)

Spliterator<String> sp = reader.lines().spliterator();    

sp.tryAdvance(YourConsumer)
sp.forEachRemaning(DifferentConsumer)

答案 1 :(得分:5)

不要让你的生活如此艰难:

String header = reader.readLine();
if(header != null) {
    action1(header);
    reader.lines().forEach(line -> action2(line));
}

或者如果您已经有实施Consumer<String>的行动:

String header = reader.readLine();
if(header != null) {
    action1.accept(header);
    reader.lines().forEach(action2);
}

答案 2 :(得分:2)

您可以使用AtomicBoolean

尝试此操作
AtomicBoolean first = new AtomicBoolean(true);
reader.lines()
      .forEach(s -> first.getAndSet(false) ? FirstConsumer : SecondConsumer);