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

Get Learning Java Lambdas now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.