Java 8 Currying tutorial
Currying (named after Haskell Curry) is the fact of evaluating function arguments one by one, producing a new function with one argument less on each step. Java 8 still does not have first class functions, but currying is “practically” possible with verbose type signatures, which is less than ideal. Here is a very simple example:
package com.java8.examples; import java.util.function.Function; public class CurryTest { public static void main(String[] args) { Function<Integer,Function<Integer,Integer>> add = (a) -> (b) -> a + b; Function<Integer,Integer> addOne = add.apply(1); Function<Integer,Integer> addFive = add.apply(5); Function<Integer,Integer> addTen = add.apply(10); Integer result1 = addOne.apply(2); // returns 3 Integer result2 = addFive.apply(2); // returns 7 Integer result3 = addTen.apply(2); // returns 12 System.out.println("result1 = " + result1); System.out.println("result2 = " + result2); System.out.println("result3 = " + result3); } }
The output will be:
result1 = 3
result2 = 7
result3 = 12
System.out.println(add.apply(1).apply(3)); // returns 4
If you want to add 3 numbers
Function<Integer,Function<Integer,Function<Integer, Integer>>> add = (a) -> (b) -> (c) -> a + b + c; System.out.println(add.apply(1).apply(3).apply(5)); // returns 9
Note that the Function interface is in Java 8 API.
Now Currying in Pre Java 8 with anonymous inner classes
Define your own Function interface.
package com.currying; public interface Function<A,B> { B apply (A a); }
Provide the implementation class for Function with anonymous inner classes
package com.currying; public class FunctionImpl implements Function<Integer, Integer> { @Override public Integer apply(Integer a) { return a; } public static Function<Integer, Function<Integer, Integer>> add() { return new Function<Integer, Function<Integer, Integer>>() { @Override public Function<Integer, Integer> apply(final Integer x) { return new Function<Integer, Integer>() { @Override public Integer apply(Integer y) { return x + y; } }; } }; } public static void main(String[] args) { System.out.println(add()); //FunctionImpl object System.out.println(add().apply(1)); //FunctionImpl object System.out.println(add().apply(1).apply(2)); //3 System.out.println(add().apply(0).apply(2)); //2 } }
Output is:
com.currying.FunctionImpl$1@73d16e93
com.currying.FunctionImpl$1$1@659e0bfd
3
2
Tedious hey!!! compared to Java 8. It is even much easier in pure functional languages.
Labels: Java 8 tutorial
0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home