Olá Antônio.
Acredito que com a expressão "variáveis de fora do escopo" você quis dizer variáveis que são declaradas fora do laço de repetição, mas são acessíveis nele. Correto?
Para uso em expressões lambdas, como essa última do forEach que você exemplificou, é possível acessar somente:
- Variáveis estáticas;
- Variáveis de instância;
- Parâmetros de métodos "efetivamente final";
- Variáveis locais "efetivamente final".
No caso das "efetivamente final", o parâmetro ou variável não pode receber outra atribuição, mesmo em linhas depois de seu uso no lambda. Se acontecer isso, deixa de ser "efetivamente final" e o compilador reclama.
Exemplo de efetivamente final:
void metodo (Integer param1, Integer param2, List<Integer> lista) {
// linha abaixo compila, pois param1 é efetivamente final
lista.forEach(itemLista -> System.out.println(itemLista + param1));
// linha abaixo não compila, pois param2 não é efetivamente final
lista.forEach(itemLista -> System.out.println(itemLista + param2));
// essa atribuição, mesmo depois do uso no lambda, faz com que o param2 deixe de ser efetivamente final
param2 = 2;
}