OptionalInt和int之间的区别是什么?

13
OptionalInt max = IntStream.of(arr).max();
或者
int maximum = 0;
for (int i : arr) {
     maximum = Math.max(i, maximum);
}

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

4个回答

10
使用流式处理方式而非命令式方式的优点在于,当数组arr中没有元素时,我们将最大值表示为缺失,以表明缺少值
关于您提出的这个描述:
根据OptionalInt的定义,如果有值存在,则返回getAsIntValue(),但如果值不存在,则抛出异常。
请注意,只有在从可选结果直接调用getAsInt()且值为缺失时才会抛出异常。
getAsInt()获取元素时,如果没有值,则会抛出NoSuchElementException异常。实际上,在这种情况下获得异常可能是有用的,因为现在您知道没有值存在,而命令式方法可能会导致隐藏错误,因为如果数组为空,则最大值为0,这是错误的,除非在我下面的倒数第二段中提到的某种情况下。
像您展示的这样的小代码在存在错误时可能很容易修复,但在生产代码中,由于代码库的规模,可能很难找到错误。
如果0实际上是当数组为空时要提供的默认值,则可以继续使用命令式方法,或者使用可选方法,如下所示:
int max = IntStream.of(arr).max()
                   .orElse(0);

在上述情况下,不会抛出NoSuchElementException异常。此外,我建议不要直接从可选结果中使用getAsInt(),除非你百分之百确定数组不为空,而应该使用orElseorElseGetorElseThrow,具体取决于您认为哪种方式最适合给定的情况。


是的,这是真的。 我有一个巨大的代码库,多个List<string>或List<Product>类型正在被填充,如果它们为空,我们基本上希望跳过该列表或数组。 我认为最好的方法是 Optional.ofNullable(productlist).orElseThrow(e->e.emptyList()).stream.foreach(e-> e.getId()); - Aastha Jain

3

在你的第一个片段中,如果 arr 是空的,则没有最大值。 OptionalInt 将是空的(即它不包含任何值)。

在您的第二个片段中,如果 arr 是空的,则默认最大值为 0

实现第一个片段的逻辑而不使用 OptionalInt 可以使用一个 Integer 变量来完成,该变量可以包含一个 null 值:

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

现在,如果arr为空,则maximum将保持null

1

区别在于当arr为空时,max将会是"empty",而最大值应该是0,这在技术上是不正确的。


1

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.");
    }
}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接