Search code examples
javalambdajava-8

Writing a lambda expression when parameters are ignored in the body


How do I write a lambda expression if it doesn't require arguments and hence its name is excessive?

This way doesn't compile:

setRowFactory(-> new TableRowCustom());

But this one does:

setRowFactory(__ -> new TableRowCustom());

Is there a better way?


Solution

  • Since you've mentioned that this works

    setRowFactory(__ -> new TableRowCustom());
    

    I assume that the expected functional interface method must accept a single argument. The identifier _ is a reserved keyword since Java 8.

    I would just use a throwaway single (valid identifier) character.

    setRowFactory(i -> new TableRowCustom());
    setRowFactory($ -> new TableRowCustom()); 
    

    Although, you should probably avoid the use of the $, the Java Language Specification states

    The dollar sign should be used only in mechanically generated source code or, rarely, to access pre-existing names on legacy systems. The underscore may be used in identifiers formed of two or more characters, but it cannot be used as a one-character identifier due to being a keyword.

    You can also write out

    setRowFactory(ignored -> new TableRowCustom());
    

    to be explicit.

    The Java Language Specification defines the syntax of a lambda expression

    LambdaExpression:
      LambdaParameters -> LambdaBody 
    

    and

    LambdaParameters:
      Identifier
      ( [FormalParameterList] )
      ( InferredFormalParameterList )
    InferredFormalParameterList:
      Identifier {, Identifier}
    

    In other words, you cannot omit an identifier.


    As Holger suggests, if and when they decide to use _ as an unused parameter name, it will be easy to change from __ to _ in your source code. You may want to just stick with that for now.