如果 lambda 表达式不需要参数,因此其名称过多,我该如何编写它?
这种方式无法编译:
setRowFactory(-> new TableRowCustom());
但是这个:
setRowFactory(__ -> new TableRowCustom());
有更好的方法吗?
既然你提到这有效
setRowFactory(__ -> new TableRowCustom());
我假设预期的功能接口方法必须接受单个参数。 标识符
_
是 Java 8 以来的保留关键字。
我只会使用一次性的单个(有效标识符)字符。
setRowFactory(i -> new TableRowCustom());
setRowFactory($ -> new TableRowCustom());
尽管如此,您可能应该避免使用
$
,Java 语言规范声明
美元符号只能用在机械生成的源代码中,或者很少用于访问遗留系统上预先存在的名称。下划线可以用在由两个或多个字符组成的标识符中,但由于是关键字,因此不能用作单字符标识符。
你也可以写出来
setRowFactory(ignored -> new TableRowCustom());
要明确。
Java 语言规范定义了 lambda 表达式的语法
LambdaExpression:
LambdaParameters -> LambdaBody
和
LambdaParameters:
Identifier
( [FormalParameterList] )
( InferredFormalParameterList )
InferredFormalParameterList:
Identifier {, Identifier}
换句话说,您不能省略标识符。
正如 Holger 所建议的,如果他们决定使用
_
作为未使用的参数名称,那么在源代码中从 __
更改为 _
将很容易。您现在可能只想坚持下去。
从 Java 21(2023 年 9 月)开始,您可以执行以下操作:
setRowFactory(_ -> new TableRowCustom());
_
就是所谓的“未命名变量”(预览功能)。来自JEP 443:
使用未命名模式和未命名变量(可以初始化但不能使用)来增强Java语言,它可以匹配记录组件而不说明组件的名称或类型。两者均由下划线字符
表示。这是一个预览语言功能。_
[…]
当局部变量声明语句中的局部变量、catch 子句中的异常参数或 lambda 表达式中的 lambda 参数用下划线表示时,就声明了未命名变量。它允许省略语句或表达式中类型或 var 后面的标识符;例如,
int _ = q.remove();
... } catch (NumberFormatException _) { ...
(int x, int _) -> x + x
对于单参数 lambda 表达式,例如
,未命名变量不应与未命名模式混淆。_ -> "NODATA"
术语确实有点令人困惑,但是 Nicolai Parlog 来拯救:
未命名变量的工作方式为:
- 局部变量
- 尝试使用资源
- for循环变量
- 异常参数
- lambda 参数
他们与
合作。var
未命名模式变量:
- 作为模式变量
- 需要显式类型
未命名模式:
- 将图案替换为
_
- 不绑定任何东西
- 匹配一切
- 仅在嵌套模式中