Monday, February 03, 2014

Because Java 8 and because Lambda

package java8.test;

import java.util.Arrays;

public class Main {

 interface Duo {
  int apply(int n, Duo g);
 }

 interface Trio {
  int apply(int n, int prod, Trio g);
 }

 interface Quad {
  int apply(int n, int a, int b, Quad g);
 }

 static Duo factorial = (n, g) -> n > 0 ? n * g.apply(n - 1, g) : 1;
 static Trio tailFactorial = (n, p, g) -> n == 0 ? p : g.apply(n - 1, n * p, g);
 static Quad fibonacci = (n, a, b, g) -> n == 0 ? a : g.apply(n - 1, b, a + b, g);

 public static void main(String[] args) {  
  Arrays.asList(args)
    .stream()
    .map(Integer::decode)
    .map(n -> String.format(
       Arrays.asList("factorial(%d) = %d",
            "tailFactorial(%d) = %d", 
            "fibonacci(%d) = %d")
            .stream()
            .reduce("",
              (a, b) -> a
                  + (a.isEmpty() ? a : System.getProperty("line.separator"))
                  + b), 
       n, factorial.apply(n, factorial), 
       n, tailFactorial.apply(n, 1, tailFactorial), 
       n, fibonacci.apply(n, 0, 1, fibonacci)))
    .forEach(System.out::println);
 }
}

No comments: