OptionalInt 和 int 之间的区别?
OptionalInt max = IntStream.of(arr).max();
或
int maximum = 0;
for (int i : arr) {
maximum = Math.max(i, maximum);
}
这两种方法都返回最大值。有什么区别?根据 的定义,如果值存在,则返回,但如果值不存在,则抛出 .OptionalInt
OptionalInt
getAsInt()
Exception
OptionalInt max = IntStream.of(arr).max();
或
int maximum = 0;
for (int i : arr) {
maximum = Math.max(i, maximum);
}
这两种方法都返回最大值。有什么区别?根据 的定义,如果值存在,则返回,但如果值不存在,则抛出 .OptionalInt
OptionalInt
getAsInt()
Exception
与命令式方法相比,使用流方法的优点是,当数组中没有元素时,我们将最大值表示为不存在以指示缺失值。arr
关于这个描述,你已经说过:
根据 OptionalInt 的定义,如果存在值,则返回 getasIntValue(), 但如果值不存在,则抛出异常。
请注意,仅当您直接从可选结果调用 getAsInt() 并且该值不存在时,它才会引发异常。
从某种意义上说,这是一件好事,因为正如我们所提到的,当我们尝试使用getAsInt()访问元素并且没有存在值时,将抛出a,并且在这种情况下,实际上获得异常可能是有用的,因为您现在知道不存在值,而命令式方法可能导致隐藏错误,因为如果数组为空,则最大值是假的,除非在我下面倒数第2段中提到的某种情况下。NoSuchElementException
0
当您显示的此类小代码在存在错误时可能很容易修复,但在生产代码中,由于代码库的大小,可能很难找到。
如果实际上是您希望在数组为空时提供的默认值,则可以按原样继续使用命令式方法,也可以使用可选方法,可以按如下方式完成:0
int max = IntStream.of(arr).max()
.orElse(0);
在上述方案中,不会引发异常。另外,我建议不要直接从可选结果中使用getAsInt(),除非你100%确定数组不会为空。而是利用orElse,orElseGet或orElseThrow,这取决于您认为哪种情况最适合给定的情况。NoSuchElementException
在第一个代码段中,如果 为空,则没有最大值。将为空(即它不包含任何值)。arr
OptionalInt
在第二个代码段中,如果 为空,则默认值为默认值。arr
0
实现第一个代码段的逻辑而不使用 可以使用变量来完成,该变量可以包含一个值:OptionalInt
Integer
null
Integer maximum = null;
for (int i:arr) {
maximum = maximum != null ? Math.max(i,maximum) : i;
}
如果 为空,则现在将保留。maximum
null
arr