Java 11:Lambda 参数的局部变量语法 - 应用程序

2022-09-03 07:48:45

我对Java-11感到好奇,但特别是JEP:323,它计划将声明添加到Lambda操作变量中。var

这里很好地讨论了此功能背后的动机。请考虑文章中的以下引用:

// #1 - Legal
ITest divide = (@ATest var x, final var y) ->  x / y;
/* #2 Modifiers on Old-Style implicit paramaters => Illegal */
ITest divide = (@ATest x, final y) ->  x / y;

最终修饰符的使用对我来说很清楚,并且符合不可变性最佳实践。

但是,我不确定注释。能够注释 lambda 隐式参数的最大好处是什么?

您能否提供一个在 lambda 操作变量上使用注释的事实上的有益示例?不是作为意见问题,而是作为代码的实际示例,在使用此功能时更具可读性或效率。


答案 1

能够注释 lambda 隐式参数的最大好处是什么?

lambda 语句中注释的使用应类似于非 lambda 语句上的任何其他属性。这可能是为了利用:

  • 在运行时反射并推断有关带注释对象的一些信息。
  • 也在编译时描述行为,例如生成的源代码或其他工具提示

JEP-323本身陈述的用例(重申我自己不确定这是否是你所期待的) -

(@Nonnull var x, @Nullable var y) -> x.process(y)

其中,库可以使用批注来确定对 和 的值检查。在这一点上,您知道现在甚至不对x进行显式空检查,这肯定不能抛出NullPointerException,这与任何其他显式注释的非lambda参数相同。xyx.process(y)

值得注意的是,这是引入允许隐式类型 lambda 表达式的形式参数的统一性的好处之一。var


答案 2