为什么Java 8中存在像DoubleFunction这样的原始函数
我刚看了一下新的Java 8 函数包,并想知道为什么有这样的接口
DoubleFunction
-
IntFunction
-
LongFunction
- …
哪些不扩展Function
。 这是否意味着我无法传递Function
,其中需要IntFunction
,反之亦然? 这同样适用于*Block
, *Supplier
和*UnaryOperator
。
我可以看到返回基元时我不必检查null
的优点,但缺点列表似乎要长得多
这个问题与以下事实有关:Java中的原始类型不统一为可替代Object
,并且具有generics类型擦除。
当最后一个有足够的2个缺点时Function
使用Function
代替IntFunction
:
- 每个返回的
int
都是盒装的 – 意味着更大的内存占用; - 每个返回的
Integer
都会得到一个自动运行时检查(可以优化掉,但是是的……);
请注意,Java中的集合框架的这些问题导致人们编写了一个名为Trove的整个库,它避开了通用接口,支持每种基本类型的专用集合类型。