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

Als*_*esh 12 java java-8 java-stream

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

BufferedReader reader = ...
reader.lines().forEach(Same common Action)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

但那是复杂而丑陋的,根本就没有使用流.如何使用Java 8流以惯用的方式做到这一点?

Eug*_*ene 21

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

sp.tryAdvance(YourConsumer)
sp.forEachRemaning(DifferentConsumer)
Run Code Online (Sandbox Code Playgroud)

  • 或者`if(sp.tryAdvance(YourConsumer))sp.forEachRemaning(DifferentConsumer);`.但这只适用,如果有的话,你没有中间流操作,或者它们在标题处理和普通行处理之间是通用的.但是在"BufferedReader"的情况下,[有一个更简单的解决方案](/sf/answers/3304502001/); 仅使用普通线路的流,而不是唯一的标题线... (2认同)

Hol*_*ger 5

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

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

或者如果您已经执行了Consumer<String>以下操作:

String header = reader.readLine();
if(header != null) {
    action1.accept(header);
    reader.lines().forEach(action2);
}
Run Code Online (Sandbox Code Playgroud)