accumulate祭 Java版

どうかと思うコードだけど、効率は度外視すれば、オートボクシングとGENERICSを駆使してできないことはないようです。

abstract class Combiner<T> {
  public abstract T apply(T lhs, T rhs);
}

public class Hoge {
  public static <T> T accumulate(Combiner<T> comb, T initial, Iterable<T> array){
    T ret = initial;
    for( T i : array ){
      ret = comb.apply(ret, i);
    }
    return ret;
  }
  public static <T> T accumulate(Combiner<T> comb, T initial, T[] array){
    return accumulate(comb, initial, java.util.Arrays.asList(array));
  }

  public static void main(String[] args){
    Number[] i_array = {1, 2, 3};
    Combiner<Number> i_add = new Combiner<Number>(){
      public Number apply(Number lhs, Number rhs){
        return new Integer(lhs.intValue() + rhs.intValue());
      }
    };
    p(accumulate(i_add, 0, i_array));

    Number[] d_array = { 3.14, 2.7182818284 };
    Combiner<Number> d_mul = new Combiner<Number>(){
      public Number apply(Number lhs, Number rhs){
        return new Double(lhs.doubleValue() * rhs.doubleValue());
      }
    };
    p(accumulate(d_mul, 1, d_array));

    Combiner<String> s_add = new Combiner<String>(){
      public String apply(String lhs, String rhs){
        return lhs + rhs;
      }
    };
    String[] s_array = { "a", "b", "c" };
    p(accumulate(s_add, "", s_array));
  }
  public static void p(Object o){
    System.out.println(o);
  }
}