为什么在Java 8中有多个版本的Optional

Muh*_*edy 4 optional java-8

我注意到,Java 8中有许多类型的多个版本.

例如,引入了Optional类有很多口味OptionalInt,OptionalLong等等.

虽然Optional有一个类型Parameter(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));
Run Code Online (Sandbox Code Playgroud)

nos*_*sid 9

从功能的角度来看,Optional<Integer>行为非常相似OptionalInt.例如,以下方法之间没有功能差异:

int foo(int value) {
    return OptionalInt.of(value).orElse(4242);
}
int bar(int value) {
    return Optional.of(value).orElse(4242);
}
Run Code Online (Sandbox Code Playgroud)

但是,性能和效率可能存在差异 - 取决于可选类型的使用方式和JIT编译器的功能.第二种方法基本上与以下方法相同:

int baz(int value) {
    return Optional.of(Integer.valueOf(value))
        .orElse(Integer.valueOf(4242))
        .intValue();
}
Run Code Online (Sandbox Code Playgroud)

如您所见,由于每个方法的自动装箱,最多会创建两个额外的Integer对象.与本机类型相比,对象的创建是昂贵的,并且每个附加对象增加了垃圾收集的压力.

这并不意味着它会对大多数应用产生影响.但它可以有所作为,如果它不存在,它会降低对Java 8 Streams的接受度.