After basically everyone on lambda-dev/lambda-libs-spec-experts tried to tell Goetz to call functions functions, I looked looked into the implementation and I guess, I can understand their concern now:
java.util.function:
-------------------BiBlock.java
BiFunction.java
BiPredicate.java
BinaryOperator.java
Block.java
Combiner.java
DoubleBinaryOperator.java
DoubleFunction.java
DoubleUnaryOperator.java
FlatMapper.java
Function.java
Functions.java
IntBinaryOperator.java
IntFunction.java
IntSupplier.java
IntUnaryOperator.java
LongBinaryOperator.java
LongFunction.java
LongUnaryOperator.java
Predicate.java
Predicates.java
Supplier.java
UnaryOperator.java(
http://hg.openjdk.java.net/lambda/lambda/jdk/file/ba27872c81f8/src/share/classes/java/util/stream/primitive/)
Not only that the naming seems to be all over the place and hard to remember (yes, names actually matter, read on ...), the manual specialization looks extremely scary. Why are they trying to solve a JVM/JIT problem (assuming Generics will never be improved) in a library in such an arcane and error-prone way (why not use at least M4 macros like in *Buffer)?
Another weird thing is that these specializations are NOT compatible with their more general implementation. So everywhere, where you'd want to define a lambda, a developer now needs to decide if you assign it to e. g.
Function<Integer,Integer> or to
IntFunction<Integer>. Even worse, there seems to be no right or wrong (as soon as your code is slightly generic on its input, you can't use the specialized functions anymore).
If a developer used the first way and some library uses the second? Bad luck.
If a developer used the second way and some library uses the first? Bad luck, too.
Also scary:
http://hg.openjdk.java.net/lambda/lambda/jdk/file/ba27872c81f8/src/share/classes/java/util/stream/primitive/ and (to a lesser amount)
http://hg.openjdk.java.net/lambda/lambda/jdk/file/ba27872c81f8/src/share/classes/java/util/stream/op/.
Keep in mind, that classes are currently only specialized to int! So if they keep this approach, the amount of classes in primitive will quadruple (int, long, float, double).
I really hope that Oracle comes up with an better approach, otherwise Java 8 will be the language will give both OOP
and FP a bad name ...