OptionalInt 和 int 之间的区别?

Aas*_*ain 9 java java-8

OptionalInt max = IntStream.of(arr).max();
Run Code Online (Sandbox Code Playgroud)

或者

int maximum = 0;
for (int i : arr) {
     maximum = Math.max(i, maximum);
}
Run Code Online (Sandbox Code Playgroud)

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

Ous*_* D. 10

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

关于您所说的此描述:

根据 OptionalInt 的定义,如果值存在则返回 getasIntValue() 但如果值不存在则抛出异常。

请注意,仅当您直接从可选结果调用getAsInt()并且该值不存在时,它才会引发异常。

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

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

如果0实际上是您想要在数组为空时提供的默认值,那么您可以按原样继续使用命令式方法,也可以使用可选方法,如下所示:

int max = IntStream.of(arr).max()
                   .orElse(0);
Run Code Online (Sandbox Code Playgroud)

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