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

标签 java lambda var java-11

我正在尝试为 lambda 表达式的 var 关键字上的 Java 11 扩展创建一个用例。我可以在网上找到的示例总是与 @NonNull 注释相关。但是当我想做这样的事情时:

long count = Stream.of(-3, -2, -1, 0, 1, 2, 3, 4)
            .filter((@NegativeOrZero var a) ->  a > -3)
            .count();

System.out.println(count);

我得到:

7

我希望只计算 -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,否则我会得到一个没有任何自定义消息的 NPE。

有人可以解释一下我在这里缺少什么吗?

编辑:也许我忘了提及,但您能否提供一个结合了 var 关键字和验证的示例以了解它的好处?

编辑 2:我发现了一个应该抛出错误的更简单的示例。但是,对我来说,它返回 true。顺便说一句,我正在使用 JDK 13。

Predicate<String> predicate = (@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
Stream.of(1, 2, 3, 4, 5, null, 7, 8, 9)
      .filter((var a) -> a > 5) // NPE on boxing null
      .count(); 

关于Java 11 局部变量类型推断改进用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59192127/

相关文章:

java - Oracle Weblogic : The root element web-app is missing in the descriptor file

c++ - lambda 的类型是什么?

c++ - Visual Studio 2010 中的友元模板类和 Lambda 函数

c# - 谁能向我解释为什么在 lambda 表达式中使用迭代变量是个坏主意

c++ - 如何为 memcpy 获取指向成员变量的指针

java - 从高到低排序文件,保留其他信息

java - MySQL数据库管理

java - JAVA中动态为一个键添加多个值

bash - 是否可以 bash/ksh 调用变量的变量

javascript - 我如何在 jquery 中使用一个简单的字符串变量?