Why are there primitive functions like DoubleFunction in Java 8
functional-programming, java
Solution
This issue is related to the fact that primitive types in Java are not unified to be substitutable for `Object`, and with generic type erasure.
Using `Function<T, Integer>` instead of `IntFunction<T>` when the last one suffices has 2 disadvantages:
- Every returned `int` is boxed - meaning a larger memory footprint;
- Every returned `Integer` gets an automatic runtime check (which can be optimized away, but yeah...);
Note that these kinds of issues with the collection framework in Java have led people to write a whole library, named Trove, that eschews the generic interfaces in favor of specialized collection types for every primitive type.
Problem
I just had a look at the the new Java 8 function package and wonder why there are interfaces like - `DoubleFunction` - `IntFunction` - `LongFunction` - ... which do not extend `Function`. Doesn't that mean I will not be able to pass a `Function<T,Int>` where a `IntFunction<T>` is required and vice versa? The same applies for `*Block`, `*Supplier` and `*UnaryOperator`. I can see the advantage that I will not have to check for `null` when a primitive is returned, but the list of disadvantages seem to be much longer