OptionalInt max=IntStream.of(arr).max();
或者
int maximum=0;
for (int i:arr) {
maximum=Math.max(i,maximum);
}
这两种方法都返回最大值。 OptionalInt
有什么不同?根据{{1}}的定义,如果值存在,则返回OptionalInt
但如果值不存在,则会抛出getasIntValue()
。
答案 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%确定数组不会为空。而是根据您认为最适合特定情况的orElse,orElseGet或orElseThrow来使用。
答案 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.");
}
}
}