📅  最后修改于: 2023-12-03 15:31:54.805000             🧑  作者: Mango
在Java 8中,Optional是一种用于解决null值问题的类型,它可以表示一个值存在或者不存在。Optional提供了一组方法来处理这种情况,例如orElse、orElseGet、orElseThrow等等。其中,orElseThrow方法允许我们在Optional中的值为空时抛出一个异常。此方法还需要一个Supplier参数,用于返回一个异常对象。
除了用于包装引用类型外,Optional还提供了Int、Long和Double等类型的包装,分别对应基本数据类型int、long和double的情况。OptionalInt是其中之一,用于包装int值类型。
OptionalInt提供了许多与Optional相同的方法,例如isPresent、ifPresent等等。还有两个特殊的方法asInt和orElse。
asInt方法:如果OptionalInt中有值,则返回该值,否则抛出一个NoSuchElementException异常。
orElse方法:如果OptionalInt中有值,则返回该值,否则返回一个默认值,例如orElse(0)。
除了以上已有的方法,OptionalInt还提供了orElseThrow方法,它允许我们在OptionalInt中的值为空时抛出一个异常。此方法还需要一个Supplier参数,用于返回一个异常对象。
public <X extends Throwable> int orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
if (isPresent()) {
return value;
} else {
throw exceptionSupplier.get();
}
}
假设我们有一个方法,用于返回一个int类型值,但是这个值有可能不存在,在Java 8之前,我们可能会返回一个-1作为空值的标记。但是在Java 8中,我们可以使用OptionalInt来解决这个问题:
public OptionalInt getNumber() {
// some code to calculate the number
if (numberExists) {
return OptionalInt.of(number);
} else {
return OptionalInt.empty();
}
}
然后,在调用getNumber方法时,我们可以使用orElseThrow方法来处理空值的情况:
int number = getNumber().orElseThrow(() -> new NoSuchElementException("Number does not exist"));
如果getNumber方法返回了一个空的OptionalInt对象,将会抛出一个NoSuchElementException异常,并且异常信息为“Number does not exist”。
注意:orElseThrow方法只在OptionalInt对象为空时才会抛出异常,不为空时将正常返回OptionalInt中的值,在这种情况下,异常Supplier将不会被调用。