Ваш второй пример использует замыкания (технически можно сказать, что компилятор вычисляет замыкание в обоих случаях, но вы не используете его в первом случае).
Закрытие - это просто "все переменные, видимые этой функции". Ни больше ни меньше. И очевидно, что в обоих случаях эти переменные существуют и определяются компилятором.
Но что мы обычно имеем в виду, когда говорим об «использовании замыканий», так это о том, что лямбда-выражения могут использовать все локальные переменные, видимые в месте, которое они объявили. Они все часть его закрытия.
В вашем случае d
- это просто параметр лямбда-функции, и, поскольку это все, что вы используете в первом случае, вы на самом деле не пользуетесь замыканиями.
Во втором случае filter
не определено в лямбда-выражении, это не параметр или что-то еще. Это локальная переменная, которая, как оказалось, видна в том месте, где объявлена лямбда. Так что это часть лямбда-замыкания, которая позволяет ссылаться на него в теле лямбды.
Редактировать
Как указано в комментариях, я не слишком внимательно читал ваш код. Я заметил только второе лямбда-выражение в каждом примере. Первая лямбда использует закрытие (в обоих случаях она закрывается свыше subFolders
)