OptionalInt 和 int 之间的区别?

2022-09-04 20:49:12
OptionalInt max = IntStream.of(arr).max();

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

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


答案 1

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

关于这个描述,你已经说过:

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

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

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

当您显示的此类小代码在存在错误时可能很容易修复,但在生产代码中,由于代码库的大小,可能很难找到。

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

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

在上述方案中,不会引发异常。另外,我建议不要直接从可选结果中使用getAsInt(),除非你100%确定数组不会为空。而是利用orElseorElseGet或orElseThrow,这取决于您认为哪种情况最适合给定的情况。NoSuchElementException


答案 2

在第一个代码段中,如果 为空,则没有最大值。将为空(即它不包含任何值)。arrOptionalInt

在第二个代码段中,如果 为空,则默认值为默认值。arr0

实现第一个代码段的逻辑而不使用 可以使用变量来完成,该变量可以包含一个值:OptionalIntIntegernull

Integer maximum = null;
for (int i:arr) {
     maximum = maximum != null ? Math.max(i,maximum) : i;
}

如果 为空,则现在将保留。maximumnullarr


推荐