Как разделить поток для обработки элементов по-разному?

Я использую такой код для обработки файла, состоящего из нескольких строк:

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 потоков?

Ответ 1

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

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

Ответ 2

Не делай так тяжело:

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);
}

Ответ 3

Вы можете попробовать это с помощью AtomicBoolean

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