OptionalInt max = IntStream.of(arr).max();
或者int maximum = 0;
for (int i : arr) {
maximum = Math.max(i, maximum);
}
这两种方法都返回最大值。那么OptionalInt
有什么区别呢?根据OptionalInt
的定义,如果存在值,则返回getAsInt()
,但如果不存在值,则抛出Exception
异常。
arr
中没有元素时,我们将最大值表示为缺失,以表明缺少值。NoSuchElementException
异常。实际上,在这种情况下获得异常可能是有用的,因为现在您知道没有值存在,而命令式方法可能会导致隐藏错误,因为如果数组为空,则最大值为0
,这是错误的,除非在我下面的倒数第二段中提到的某种情况下。0
实际上是当数组为空时要提供的默认值,则可以继续使用命令式方法,或者使用可选方法,如下所示:int max = IntStream.of(arr).max()
.orElse(0);
在上述情况下,不会抛出NoSuchElementException
异常。此外,我建议不要直接从可选结果中使用getAsInt(),除非你百分之百确定数组不为空,而应该使用orElse、orElseGet或orElseThrow,具体取决于您认为哪种方式最适合给定的情况。
在你的第一个片段中,如果 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
。区别在于当arr
为空时,max
将会是"empty",而最大值应该是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.");
}
}
}
Optional.ofNullable(productlist).orElseThrow(e->e.emptyList()).stream.foreach(e-> e.getId());
。 - Aastha Jain