Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 11局部变量类型推断改进用法_Java_Lambda_Var_Java 11 - Fatal编程技术网

Java 11局部变量类型推断改进用法

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); 我得到: 七,

我试图为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);
我得到:

七,

我希望只计算-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)