Java 8 为什么Java 8中有多个可选版本

Java 8 为什么Java 8中有多个可选版本,java-8,optional,Java 8,Optional,我注意到,在Java8中有许多类型的多个版本 例如,引入的类有多种风格,OptionalLong等 尽管Optional有一个类型参数(Optional),我们仍然需要一些特定类型的原语,为什么 我找不到以下两者之间的巨大差异: Optional<Integer> o = Arrays.asList(1, 3, 6, 5).stream().filter(i -> i % 2 == 0).findAny(); System.out.println(o.orElse(-1));

我注意到,在Java8中有许多类型的多个版本

例如,引入的类有多种风格,
OptionalLong

尽管
Optional
有一个类型参数(
Optional
),我们仍然需要一些特定类型的原语,为什么

我找不到以下两者之间的巨大差异:

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));
Optional o=Arrays.asList(1,3,6,5).stream().filter(i->i%2==0.findAny();
系统输出打印Ln(o.orElse(-1));
OptionalInt oi=Arrays.stream(新的int[]{1,3,6,5}).filter(i->i%2==0.findAny();
系统输出打印项次(oi.orElse(-1));

从功能的角度来看,
可选
的行为确实与
可选
非常相似。例如,以下to方法之间没有功能差异:

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();
}
如您所见,由于每个方法调用的自动装箱,最多将创建两个额外的整数对象。与本机类型相比,创建对象的成本很高,而且每增加一个对象都会增加垃圾收集的压力


这并不意味着,它将对大多数应用程序产生影响。但是它可以带来不同,如果它不存在,它会降低对Java 8流的接受度。

您要寻找的最大区别是性能。如何?为什么我们在其他部分看不到这种约定?您会问,原语如何比包装器对象快?在JDK的其他部分,他们并没有对性能给予太多的关注。但是,当你制作一个功能的关键好处是性能时,你就有了另一个故事。对原始类型的专门化并没有什么特别之处。看看
java.util.array
,您会发现,基本上每个算法都存在8次。相反,Optional只存在四次。可能会为你的任务添加更多细节。