Java 11局部变量类型推断改进用法
我试图为lambda表达式的var关键字上的Java11扩展创建一个用例。我可以在网上找到的例子总是与@NonNull注释有关。但是,当我想做这样的事情时:Java 11局部变量类型推断改进用法,java,lambda,var,java-11,Java,Lambda,Var,Java 11,我试图为lambda表达式的var关键字上的Java11扩展创建一个用例。我可以在网上找到的例子总是与@NonNull注释有关。但是,当我想做这样的事情时: long count = Stream.of(-3, -2, -1, 0, 1, 2, 3, 4) .filter((@NegativeOrZero var a) -> a > -3) .count(); System.out.println(count); 我得到: 七,
long count = Stream.of(-3, -2, -1, 0, 1, 2, 3, 4)
.filter((@NegativeOrZero var a) -> a > -3)
.count();
System.out.println(count);
我得到:
七,
我希望只计算-2、-1和0,而不计算其他,或抛出错误或其他。以下情况也是如此:
long count = Stream.of(1, 2, 3, 4, 5, null, 7, 8, 9)
.filter((@NotNull(message="It is a null!!") var a) -> a > 5)
.count();
System.out.println(count);
除非我将a>5
更改为a!=null&&a>5
,与注释无关
有人能解释一下我在这里遗漏了什么吗
编辑:也许我忘了提一下,但你能提供一个结合var关键字和验证的例子来理解它的好处吗
编辑2:我发现了一个更简单的例子,应该抛出一个错误。然而,对我来说,这是真的。我正在使用JDK 13 btw
Predicate<String> predicate = (@NotNull var a) -> true;
System.out.println(predicate.test(null));
谓词=(@NotNull var a)->true;
System.out.println(predicate.test(null));
java.util.stream
类与javax.validation
没有任何关系,因此流不会理解或处理@NotNull
或@NegativeOrZero
。注释类型时,只提供元数据。必须对这些元数据进行处理才能创建所需的行为,而流则不能
您的示例评估为:
Stream.of(-3, -2, -1, 0, 1, 2, 3, 4)
.filter((var a) -> a > -3)
.count(); // 7 as only -3 is filtered out
通过使用JetBrains注释,可以使用局部变量语法为Lambda参数预过滤空值 将在运行时生成
IllgalArgumentException
而不是NullPointerException
:
Exception in thread "main" java.lang.IllegalArgumentException: Argument for @NotNull parameter 'i' of com/app/App.lambda$main$0 must not be null
at com.app.App.$$$reportNull$$$0(App.java)
at com.app.App.lambda$main$0(App.java)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)
正如现在所说的,
javax.constraint.*
注释不会自动执行,作为对lambda参数的验证。我敢肯定,随着时间的推移,越来越多的库,如静态代码分析器或编译时检查工具,将利用该功能并支持该功能。从javax.validation.constraints
包中获取@NegativeOrZero
@YCF\u L。您可以找到一个,因此,您所寻求的应用程序并不多。@Naman这个抽象示例对我没有帮助。我理解这一点,但我不理解如何从var和lambda组合的验证中获益。您能提供一个使用示例吗?javax.validation
注释是JSR380的一部分,需要一些东西来处理它们,请参阅。我从未见过有人在核心java流中使用这些注释,核心java中没有任何东西可以处理它们。好吧,我明白了,但是我可以使用什么类型的注释呢?我试过龙目山和斯普林山,但没能让它们发挥作用。我只需要一个例子…@OkanMenevşeoğlu Lombok是一个编译时javac
注释处理器,Spring主要是运行时代理(还有AspectJ、CGLIB、ASM和其他)。在使用注释之前,先了解注释是如何应用的。
import org.jetbrains.annotations.NotNull;
...
public static void main(String[] args) {
long cnt = Stream.of(2, 4, 6, 8, 10, null, 1)
.filter((@NotNull var i) -> i > 5)
.count();
System.out.println(cnt);
}
Exception in thread "main" java.lang.IllegalArgumentException: Argument for @NotNull parameter 'i' of com/app/App.lambda$main$0 must not be null
at com.app.App.$$$reportNull$$$0(App.java)
at com.app.App.lambda$main$0(App.java)
at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:176)