Question

I've just replaced s in the following lambda expression by _:

s -> Integer.parseInt(s)

Eclipse compiler says:

'_' should not be used as an identifier, since it is a reserved keyword from source level 1.8 on.

I haven't found any explanation in the JLS §3.9 Lexical Structure / Keywords.

Was it helpful?

Solution

The place to look is JLS §15.27.1. Lambda Parameters

It is a compile-time error if a lambda parameter has the name _ (that is, a single underscore character).

The use of the variable name _ in any context is discouraged. Future versions of the Java programming language may reserve this name as a keyword and/or give it special semantics.

So the Eclipse message is misleading, especially as the same message is used for both cases, when an error is generated for a lambda parameter or when a warning is generated for any other _ identifier.

OTHER TIPS

It is the Phase 2 of JEP 302, that is going to add underscore as a special character to denote unused parameters in lambda expressions.

Treatment of underscores

In many languages, it is common to use an underscore (_) to denote an unnamed lambda parameter (and similarly for method and exception parameters):

BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);

This allows stronger static checking of unused arguments, and also allows multiple arguments to be marked as unused. However, because underscore was a valid identifier as of Java 8, compatibility required us to take a more indirect path to getting to where underscore could serve this role in Java. Phase 1 was forbidding underscore as a lambda formal parameter name in Java 8 (this had no compatibility consequence, since lambdas did not exist previously) and a warning was issued for using underscore as an identifier in other places. Phase 2 came in Java 9, when this warning became an error. We are now free to complete the planned rehabilitation of underscore to indicate an unused lambda, method, or catch formal parameter.

Java Language Changes for Java SE 9 https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD

From Java 9, the _ character cannot be used as an identifier anymore, not just within the lambda context

The underscore character is not a legal name.

If you use the underscore character ("_") an identifier, your source code can no longer be compiled.

tl;dr

The underscore character takes on a special new meaning as Java evolves.

Underscore gains new meaning, eliding type and name

As a preview feature in Java 21, we see the underscore character used to:

  • elide the type and name of a record component in pattern matching.
  • elide the identifier which follows the type or var in a type pattern.

See JEP 443: Unnamed Patterns and Variables (Preview).

Underscore as identifier disallowed in Java 9+

The underscore character (_) is code point 95 decimal, 5F hex. Formally named LOW LINE in the Unicode standard.

Using underscore as an identifier throws:

  • a warning in Java 8.
  • an error in Java 9+.

See: JEP 213: Milling Project Coin.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top