Access to local variables of the enclosing scope
The accepted Answer by Karl Bielefeldt is correct. I can add one more distinction:
The lambda code nested inside a method inside a class can access any effectively-final variables found within that method & class.
Creating a class that implements the functional interface does yield such direct access to the state of the calling code.
To quote the Java Tutorial (emphasis mine):
Like local and anonymous classes, lambda expressions can capture variables; they have the same access to local variables of the enclosing scope. However, unlike local and anonymous classes, lambda expressions do not have any shadowing issues (see Shadowing for more information). Lambda expressions are lexically scoped. This means that they do not inherit any names from a supertype or introduce a new level of scoping. Declarations in a lambda expression are interpreted just as they are in the enclosing environment.
So while there are benefits to pulling out long code and naming it, you must weigh that against the simplicity of direct access to the state of the enclosing method & class.
See: