java - OptionalInt 和 int 之间的区别?

标签 java java-8

OptionalInt max = IntStream.of(arr).max();

或者

int maximum = 0;
for (int i : arr) {
     maximum = Math.max(i, maximum);
}

这两种方法都返回最大值。 OptionalInt 有什么不同?根据 OptionalInt 的定义,如果值存在则返回 getAsInt() 但如果值不存在则抛出 Exception

最佳答案

使用流方法优于命令式方法的优势在于,当数组 arr 中没有元素时,我们将最大值表示为 absent 以指示缺失值

关于您所说的描述:

As per the definition of OptionalInt,if value if present it returns getasIntValue() but if value is not present ,it throws Exception.

请注意,它仅在您调用 getAsInt() 时抛出异常直接来自可选结果,并且值为不存在

从某种意义上说,当我们尝试使用 getAsInt() 访问元素时,这是一件好事正如您所提到的,并且不存在任何值,那么将抛出 NoSuchElementException 并且实际上获得一个异常,在这种情况下,这可能很有用,因为您现在知道不存在任何值,而命令式方法可能会导致隐藏错误,因为如果数组为空,则最大值为 0,这是错误的,除非在我下面的第二段到最后一段中提到的特定情况下。

如您所展示的这样的小代码在出现错误时可能很容易修复,但在生产代码中,由于代码库的大小,可能很难找到。

如果 0 实际上是您希望在数组为空时提供的默认值,那么您可以按原样继续使用命令式方法,或者使用可选方法,它可以按以下方式完成:

int max = IntStream.of(arr).max()
                   .orElse(0);

在上面的场景中,不会抛出NoSuchElementException异常。另外,我建议不要使用 getAsInt()直接来自可选结果,除非您 100% 确定数组不会为空。而是利用 orElse , orElseGetorElseThrow取决于您认为哪个最适合给定的情况。

关于java - OptionalInt 和 int 之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47976489/

相关文章:

java - 将对象解析为整数

java - 将 Eclipse for Java EE 与 CDT 相结合

java多类绘画

java - OutputStream 与 BufferedOutputStream

java - 按对象分组 - Java 流

java - 这是局部变量还是静态变量捕获?

java - 按类别分区和映射 Java 流

java - 运动 : What is the best/safe way to shutdown a worker?

java - 使用 appendchild 时 Zkoss zhtml extra div?

java - 执行 Java 8 内部流的实例