Let’s go to the Java Language Specification on names and their scopes
The scope of a formal parameter of a method (§8.4.1), constructor
(§8.8.1), or lambda expression (§15.27) is the entire body of the
method, constructor, or lambda expression.The scope of a local variable declaration in a block (§14.4) is the
rest of the block in which the declaration appears, starting with its
own initializer and including any further declarators to the right in
the local variable declaration statement.
Then, on the subject of shadowing and obscuring
A local variable (§14.4), formal parameter (§8.4.1, §15.27.1),
exception parameter (§14.20), and local class (§14.3) can only be
referred to using a simple name, not a qualified name (§6.2).Some declarations are not permitted within the scope of a local
variable, formal parameter, exception parameter, or local class
declaration because it would be impossible to distinguish between the
declared entities using only simple names.It is a compile-time error if the name of a local variable v is used
to declare a new variable within the scope of v, unless the new
variable is declared within a class whose declaration is within the
scope of v.
So, in
User user = users.stream().filter((user) -> user.getId() == 1).findAny().get();
, the scope of the variable user
is everything after it in that block. Now you are trying to use the name of that variable to declare a new variable within the scope, but not
within a class whose declaration is within the scope of v.
so a compile time error occurs. (It’s declared in a lambda expression, not in a class.)