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

Original source

Related problems