Scoping
The good news with lambdas is that they don't introduce any new scoping. Using variables within a lambda will refer to variables residing in the enclosing environment.
This is what's called lexical scoping. It means that lambdas don't introduce a new level of scoping at all; you can directly access fields, methods and variables from the enclosing scope. It's also the case for the this and super keywords. So we don't have to worry about the crazy nested class syntax for resolving scope.
Let's take a look at an example. We have an example class here, with a member variable i
set to the value of 5
.
public static class Example { int i = 5; public Integer example() { Supplier<Integer> function = () -> i * 2; return function.get(); } }
In the example
method, a lambda uses a variable called i
and multiplies it by two.
Because lambdas are lexically scoped, i
simply refers to the enclosing classes' variable. It's value at...