为什么在 Java 8 中有像 DoubleFunction 这样的原始函数

Man*_*idt 3 java functional-programming

我刚刚看了新的Java 8函数包,想知道为什么会有这样的接口

  • DoubleFunction
  • IntFunction
  • LongFunction
  • ...

这也不会延长Function。这是否意味着我将无法通过 a需要a 的Function<T,Int>地方IntFunction<T>,反之亦然?这同样适用于*Block*Supplier*UnaryOperator

我可以看到在null返回原语时不必检查的优点,但缺点列表似乎要长得多

Jea*_*nal 5

这个问题与 Java 中的原始类型不统一以替代Object和泛型类型擦除这一事实有关。

当最后一个就足够Function<T, Integer>IntFunction<T>时使用而不是有两个缺点:

  • 每个返回的int都是装箱的——意味着更大的内存占用;
  • 每个返回的Integer都会进行自动运行时检查(可以优化掉,但是是的...);

请注意,Java 中的集合框架的这些类型的问题导致人们编写了一个名为 Trove 的完整库,它避开了通用接口,支持每个原始类型的专用集合类型。