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); } }