var 和 lambda 表达式的用例是什么

What is the use case for var with lambda expression

需要有关如何使用 java 11 项新功能(带有 lambda 表达式的 var)的帮助。使用流的旧方法

var listString = new ArrayList<>(Arrays.asList(new String[] {"a", "ab", "cd", null}));
long result = listString.stream().filter(x -> x != null && x.contains("a")).count();
System.out.println(result); //2

新java 11 代码变量与 lambda 表达式

var listString = new ArrayList<>(Arrays.asList(new String[] {"a", "ab", "cd", null}));
long result = listString.stream().filter((@NonNull var x) -> x.contains("a")).count();
System.out.println(result); //null pointer exception

优点:注释可以应用于局部变量(使用 var),如 nonnull 或 final。这在旧版本的 java(低于 9)

中是不可能的

现在,即使添加了 NonNull 注释(抛出空指针异常),我的新代码似乎也无法正常工作。但是我需要添加一个额外的条件才能使其工作(就像旧方法一样)

var listString = new ArrayList<>(Arrays.asList(new String[] {"a", "ab", "cd", null}));
long result = listString.stream().filter((@NotNull var x) -> x != null && x.contains("a")).count();
System.out.println(result); //2

现在我在 java 中找不到新编码方式的任何优势。有人能告诉我新编码方式如何真正帮助开发人员的场景吗?

您假设添加 @NonNull 注释会神奇地过滤掉空值。这不是事情的工作方式,除非您首先阻止空值进入,否则仍然需要进行显式空值检查。

@NonNull 要么被验证框架使用(不适用于 lambda AFAIK 的参数),要么提示静态分析器建议不正确的用法(例如,如果可能实际传递了 null,或在声明某些内容不为空时执行不必要的空检查)。

就我个人而言,我不认为在 lambda 中使用 var 会是一个非常有用的用例,它只是从以下事实中自动得出的,因为 (String x) -> ....x -> ... 是调用站点的有效 lambda,(var x) -> ... 也是如此(因为可以推断类型)。

详见JEP 323: Local-Variable Syntax for Lambda Parameters

For uniformity with local variables, we wish to allow 'var' for the formal parameters of an implicitly typed lambda expression

For formal parameters of implicitly typed lambda expressions, allow the reserved type name var to be used, so that:

(var x, var y) -> x.process(y)

is equivalent to:

(x, y) -> x.process(y)

An implicitly typed lambda expression must use var for all its formal parameters or for none of them.

是的,JEP 列表能够注释 var 作为一个好处,但这与显式类型的 lambdas 已经可能的没有什么不同:(@NonNull String x) -> ...,它现在也只是允许它用于隐式类型的 lambda。

一般来说,添加此类注释只会对文档、静态分析器以及某些代码生成注释处理器有好处。 Java 中的注释本身什么都不做,它们需要注释处理器或反射才能真正发挥作用。