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 中的注释本身什么都不做,它们需要注释处理器或反射才能真正发挥作用。
需要有关如何使用 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 中的注释本身什么都不做,它们需要注释处理器或反射才能真正发挥作用。