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

时间:2014-04-27 11:48:08

标签: java-8 optional

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

例如,引入的Optional类有很多种OptionalIntOptionalLong等。

虽然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));

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的接受度。