Прочтите файл с помощью Stream и следите за текущим индексом

Я читаю большой файл как таковой:

try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
    stream.skip(1).forEach(Main::parseLine);
} catch (IOException e) {
    e.printStackTrace();
}

где строка разбора выглядит так:

private static void parseLine(String line) {
    System.out.println(line);
}

то, что я хотел бы сделать, также отслеживать текущую строку, которую я читаю, и вместо этого parseLine будет выглядеть так:

private static void parseLine(String line, int idx) {
    System.out.println(line);
}

Как я могу это сделать?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
0
48
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Соберите строки в список, затем используйте IntStream.range или явный цикл for для вызова вашего метода, передавая элемент вместе с индексом:

List<String> result = stream.skip(1).collect(Collectors.toList());    
IntStream.range(0, result.size())
         .forEach(i -> parseLine(result.get(i), i));

Другой вариант - использовать LineNumberReader API.

Вы можете использовать настраиваемую реализацию Consumer, которая отслеживает индекс с использованием переменной счетчика:

stream.skip(1).forEach(new Consumer<String>(){
    private final long counter = 0L;

    @Override
    public void accept(String line){
        parseLine(line, counter++);
    }
});

Другие вопросы по теме