Ответ 1
Spliterator<String> sp = reader.lines().spliterator();
sp.tryAdvance(YourConsumer)
sp.forEachRemaning(DifferentConsumer)
Я использую такой код для обработки файла, состоящего из нескольких строк:
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 потоков?
Spliterator<String> sp = reader.lines().spliterator();
sp.tryAdvance(YourConsumer)
sp.forEachRemaning(DifferentConsumer)
Не делай так тяжело:
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);
}
Вы можете попробовать это с помощью AtomicBoolean
AtomicBoolean first = new AtomicBoolean(true);
reader.lines()
.forEach(s -> first.getAndSet(false) ? FirstConsumer : SecondConsumer);