[英]Difference between OptionalInt and int?
OptionalInt max = IntStream.of(arr).max();
或者
int maximum = 0;
for (int i : arr) {
maximum = Math.max(i, maximum);
}
这两种方法都返回最大值。 OptionalInt
有什么不同? 根据OptionalInt
的定义,如果 value 存在,则返回getAsInt()
但如果 value 不存在,则抛出Exception
。
使用流方法优于命令式方法的优点是,当数组arr
中没有元素时,我们将最大值表示为不存在以指示缺失值。
关于您所说的此描述:
根据 OptionalInt 的定义,如果值存在则返回 getasIntValue() 但如果值不存在则抛出异常。
请注意,仅当您直接从可选结果调用getAsInt()并且该值不存在时,它才会引发异常。
这是一件好事,因为当我们尝试使用您提到的getAsInt()访问元素并且没有值存在时,将抛出NoSuchElementException
并且实际上获得异常,在这种情况下,可能很有用,因为您现在知道不存在任何值,而命令式方法可能会导致隐藏错误,因为如果数组为空,则最大值为0
,这是错误的,除非在我下面的第 2 至最后一段中提到的特定情况下。
这样,当出现错误时,您所展示的小代码可能很容易修复,但在生产代码中,由于代码库的大小,可能很难找到。
如果0
实际上是您想要在数组为空时提供的默认值,那么您可以按原样继续使用命令式方法或使用可选方法,它可以这样做:
int max = IntStream.of(arr).max()
.orElse(0);
在上述场景中,不会抛出NoSuchElementException
异常。 另外,我建议不要直接从可选结果中使用getAsInt() ,除非您 100% 确定数组不会为空。 而是使用orElse 、 orElseGet或orElseThrow ,具体取决于您认为最适合给定情况的方法。
在您的第一个片段中,如果arr
为空,则没有最大值。 OptionalInt
将为空(即它不包含任何值)。
在您的第二个代码段中,如果arr
为空,则默认最大值为0
。
可以使用Integer
变量来实现没有OptionalInt
的第一个代码段的逻辑,该变量可以包含一个null
值:
Integer maximum = null;
for (int i:arr) {
maximum = maximum != null ? Math.max(i,maximum) : i;
}
现在maximum
仍将是null
,如果arr
为空。
不同之处在于,当arr
为空时, max
将为“空”,而最大值为 0,这在技术上是不正确的。
OptionalInt 允许我们创建一个可能包含也可能不包含 int 值的对象。 如果存在值,则isPresent()将返回 true 并且getAsInt()将返回该值。
提供了依赖于包含值的存在与否的其他方法,例如 orElse()。
其他类似于 OptionalInt 的类是 OptionalFloat、OptionalDouble、Optional。 这些可以帮助我们消除由于运行时缺少值而发生的异常。
这是 OptionalDouble 的示例
public class SumAndAverage {
public static void main(String[] args) {
List<Person> persons = new ArrayList<>();
persons.add(new Person("Joe", 55));
persons.add(new Person("Moe", 33));
persons.add(new Person("Hill", 94));
OptionalDouble average = persons.stream().mapToInt(p -> p.getAge()).average();
if (average.isPresent()) {
System.out.println(average.getAsDouble());
} else {
System.out.println("Could not calculate average.");
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.