繁体   English   中英

OptionalInt 和 int 之间的区别?

[英]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% 确定数组不会为空。 而是使用orElseorElseGetorElseThrow ,具体取决于您认为最适合给定情况的方法。

在您的第一个片段中,如果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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM