当前位置: 首页 > 面试题库 >

为什么Streams.allMatch(在Java8中)试图尝试评估所有表达式,即使可以在中间确定值时也是如此?

顾均
2023-03-14
问题内容

考虑一下此片段-

 String a = "hello" , b = null, c = "guru";
  boolean value = Stream
  .of(a, b, b.substring(2),c)
  .allMatch(x -> x != null);

  System.out.println(value);

这导致了NPE。似乎正在这样做,b.substring(2)并且既然bnull,就会抛出NPE。为什么要评估这种情况?第二个表达式bnull,因此计算为false。因此,allMatch无论后续操作的真值如何,都将为false。在这种情况下,为什么要进行评估b.substring(2)

本文和本文声称,如果不需要确定结果,则可能不评估所有表达式。显然,这里似乎并非如此。

在Java 7之前-

if(b != null && b.substring(2) != null)

这不会抛出NPE,因为b!= nullfalse它会返回false那里本身。因此,我们可以说这Streams.allMatch与上述Java代码片段不完全相同吗?


问题答案:

Streams.allMatch是否与上述Java代码段完全等效?

当然不是!流是思考数据处理的一种非常新的方式。

无论如何,您的问题(与此无关)仅仅是对于任何函数调用而言,都会对参数进行求值,因此of需要对其求值的调用b.subString(2)显然会引发NPE。

Java语言规范中的相关信息(重点是我的):

15.7.4从左到右评估参数列表

方法或构造函数调用或类实例创建表达式中,参数表达式可能出现在括号内,以逗号分隔。每个参数表达式似乎都在其右侧任何参数表达式的任何部分之前被
完全评估



 类似资料:
  • 我理解经典例子的问题 但我无法说服自己以下是有效的还是无效的 我知道'foo(i)'和'i'的求值顺序是不确定的,但是'评估'到底是什么意思?也就是说bar的第二个参数总是42,或者'i'的当前值可以在foo改变它之前被传入吗?

  • 问题内容: 对象在Python中评估的真值是多少? 相关问题 Python中对象的布尔值:有关覆盖对象评估方式的讨论 问题答案: 可以测试任何对象的真值,以在if或while条件中使用或用作以下布尔运算的操作数。以下值为“假”: 没有 假 任何数值类型的零,例如,,,。 任何空序列,例如,,。 任何空映射,例如。 用户定义的类的实例,如果该类定义了或方法,则该方法返回整数0或bool value时

  • 我正在使用Spring WebFlow 2.5.0,但是我的SpEL表达式没有得到正确的计算。我想我一定是做了什么与我的WebFlow配置或SpEL错误,但我不确定哪个。 我的登录流中有以下决策状态。xml: 但是,即使我的方法返回一个Event.success(),我也从未转换到状态。测试结果似乎总是错误的。 是我的SpEL错了,还是我做评估/测试的方式错了?如何调试SpEL评估以查看发生了什么

  • 我想使用对一个或多个数据帧列执行算术。具体来说,我想移植以下计算公式的代码: …使用进行编码。使用的原因是我想自动化许多工作流,因此动态创建它们对我很有用。 我的两个输入数据帧是: 我试图更好地理解的和参数,以确定如何最好地解决我的问题。我已经阅读了文档,但没有向我说明其中的区别。 应该使用什么参数来确保我的代码以最大的性能工作? 是否有办法将表达式的结果赋值回? 另外,为了使事情更复杂,我如何在

  • 问题内容: 在我们的项目中,我们需要在没有任何数据库服务器的情况下评估SQL语句。您能否建议一个免费的Java库,该库能够评估基于数学的SQL语句并返回结果? 例如; 输入 输出 可能会被称为 问题答案: 如下面的代码所示,可以使用ZQL来实现。但是我严重建议您选择一个简单的嵌入式数据库,例如H2(此处为示例),而应使用它(项目运行状况要高得多)。 使用H2: 输出: 要使用它,请将其添加到您的:

  • 问题内容: 如何解析和评估字符串(例如)中的数学表达式而不调用其数值? 在该示例中,我希望函数接受并返回。 问题答案: 我最终选择了该解决方案,该解决方案可用于对正整数和负整数进行求和(对正则表达式进行少许修改也可用于十进制): 我不确定它是否比eval()快,但是由于必须多次执行该操作,因此与创建javascript编译器实例负载相比,运行此脚本要舒服得多