我注意到,Java 8中有许多类型的多个版本。
例如,引入的Optional
类有很多种OptionalInt
,OptionalLong
等。
虽然Optional
有一个类型参数(Optional<T>
),但我们仍然需要一些特定的基元类型,为什么?
我找不到以下两者之间的巨大差异:
Optional<Integer> o = Arrays.asList(1, 3, 6, 5).stream().filter(i -> i % 2 == 0).findAny();
System.out.println(o.orElse(-1));
OptionalInt oi = Arrays.stream(new int[] { 1, 3, 6, 5 }).filter(i -> i % 2 == 0).findAny();
System.out.println(oi.orElse(-1));
答案 0 :(得分:9)
从功能的角度来看,Optional<Integer>
与OptionalInt
的行为非常相似,这是正确的。例如,以下方法之间没有功能差异:
int foo(int value) {
return OptionalInt.of(value).orElse(4242);
}
int bar(int value) {
return Optional.of(value).orElse(4242);
}
但是,性能和效率可能存在差异 - 取决于可选类型的使用方式和JIT编译器的功能。第二种方法基本上与以下方法相同:
int baz(int value) {
return Optional.of(Integer.valueOf(value))
.orElse(Integer.valueOf(4242))
.intValue();
}
如您所见,由于每个方法的自动装箱,最多会创建两个额外的Integer对象。与本机类型相比,对象的创建是昂贵的,并且每个附加对象都会增加垃圾收集的压力。
这并不意味着它会对大多数应用程序产生影响。但它可以有所作为,如果它不存在,它会降低对Java 8 Streams的接受度。