OptionalInt和int之间的区别?

时间:2017-12-26 09:33:20

标签: java java-8

OptionalInt max=IntStream.of(arr).max();

或者

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

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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

关于此说明,您已说明:

  

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

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

这是一件好事,因为当我们尝试使用getAsInt()访问该元素时,如您所提到的并且没有值存在,那么NoSuchElementException将被抛出并且在-fact获取异常,在这种情况下,可能是有用的,因为您现在知道没有值存在而命令式方法可能导致隐藏错误,因为如果数组为空,则最大值为0,这是除了我在下面的第二段到下一段中提到的某种情况外,这是假的。

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

如果0实际上是数组为空时要提供的默认值,那么您可以按原样继续使用命令式方法,或者使用可选方法完成:

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

在上面的场景中,不会抛出NoSuchElementException异常。此外,我建议不要直接使用getAsInt()来自可选结果,除非您100%确定数组不会为空。而是根据您认为最适合特定情况的orElseorElseGetorElseThrow来使用。

答案 2 :(得分:1)

不同之处在于,当arr为空时,max将为"为空"最大值为0,这在技术上是不正确的。

答案 3 :(得分: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.");
    }
}

}