在正文中忽略参数时编写 lambda 表达式

问题描述 投票:0回答:2

如果 lambda 表达式不需要参数,因此其名称过多,我该如何编写它?

这种方式无法编译:

setRowFactory(-> new TableRowCustom());

但是这个:

setRowFactory(__ -> new TableRowCustom());

有更好的方法吗?

java lambda java-8
2个回答
52
投票

既然你提到这有效

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 所建议的,如果他们决定使用

_
作为未使用的参数名称,那么在源代码中从
__
更改为
_
将很容易。您现在可能只想坚持下去。


2
投票

从 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
合作。

未命名模式变量:

  • 作为模式变量
  • 需要显式类型

未命名模式

  • 将图案替换为
    _
  • 不绑定任何东西
  • 匹配一切
  • 仅在嵌套模式中
© www.soinside.com 2019 - 2024. All rights reserved.