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

4
我刚刚看了一下新的Java 8函数包,想知道为什么会有像
  • DoubleFunction
  • IntFunction
  • LongFunction
  • ...
这样没有扩展Function的接口。这难道不意味着我将无法传递Function<T,Int>到需要IntFunction<T>的地方,反之亦然吗?对于*Block*Supplier*UnaryOperator也同样适用。
我可以看到不必在返回原始类型时检查null的优点,但缺点似乎更多。

与 https://dev59.com/MGAg5IYBdhLWcg3w7uuk 相关,但并非直接重复。 - Honza Zidek
1个回答

5
这个问题与Java中的原始类型不能统一替换为Object以及泛型类型擦除有关。
在最后一个足够时,使用IntFunction<T>而不是Function<T, Integer>有两个缺点:
  • 每个返回的int都被装箱 - 意味着更大的内存占用;
  • 每个返回的Integer都会自动运行时检查(可以进行优化,但是...);
请注意,这些Java集合框架的问题已经导致人们编写了一个整个库,名为Trove,它摒弃了通用接口,而是针对每种原始类型使用专门的集合类型。

这似乎是以过早优化的代价来交换更高级的编程抽象和更清晰的代码。 - Manuel Schmidt
@ManuelSchmidt:噢,绝对是的,这真的很令人沮丧。 - Louis Wasserman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接