我正在使用这样的代码来处理由多行组成的文件:
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流以惯用的方式做到这一点?
答案 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);