В какой момент лямбда в java считывает локальную переменную?

Лямбда-выражения в Java имеют доступ к локальным переменным, объявленным во внешней области видимости. Однако, чтобы лямбда-выражение могло использовать локальную переменную, эта переменная должна быть либо объявлена как final, либо эффективно финализирована, то есть ее значение не должно меняться после объявления.

Когда лямбда-выражение создается, оно захватывает (capture) значения локальных переменных, необходимых для его работы. Захваченные значения хранятся в специальном объекте, называемом замыканием (closure). Это позволяет лямбда-выражению использовать эти значения даже после выхода из области видимости, где они были объявлены.

Сам процесс захвата значений локальных переменных происходит в момент создания лямбда-выражения. Если захватываемая переменная является объектом, то ссылка на этот объект будет храниться в замыкании. Если же захватываемая переменная является примитивом, то ее значение будет копироваться в замыкание.

Важно отметить, что, хотя лямбда-выражение имеет доступ к локальным переменным, эти переменные должны быть неизменяемыми (т.е. "финализированными"). Если значение переменной изменяется после создания лямбда-выражения, это вызовет ошибку компиляции.

Таким образом, лямбда-выражение считывает значения локальных переменных во время своего создания и хранит их в замыкании для последующего использования. Это позволяет лямбда-выражению работать с локальными переменными, даже когда они уже вышли из области видимости.