fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. /* Name of the class has to be "Main" only if the class is public. */
  8. class Ideone
  9. {
  10.  
  11.  
  12. interface AverageMaker<T extends Number> {
  13. T initialResult();
  14. T add(T a, Number b);
  15. T divideByCount(T a, int b);
  16. }
  17.  
  18. public static <T extends Number, R extends Number> R averageValue(Iterable<T> items, AverageMaker<R> maker) {
  19. R res = maker.initialResult();
  20. int count = 0;
  21. for (T val : items) {
  22. res = maker.add(res, val);
  23. count++;
  24. }
  25. return maker.divideByCount(res, count);
  26. }
  27.  
  28. static final AverageMaker<Double> doubleAvg = new AverageMaker<Double>() {
  29. public Double initialResult() { return 0.0; }
  30. public Double add(Double a, Number b) { return a + b.doubleValue(); }
  31. public Double divideByCount(Double a, int b) { return a/b; }
  32. };
  33. static final AverageMaker<Integer> intAvg = new AverageMaker<Integer>() {
  34. public Integer initialResult() { return 0; }
  35. public Integer add(Integer a, Number b) { return a + b.intValue(); }
  36. public Integer divideByCount(Integer a, int b) { return a/b; }
  37. };
  38.  
  39. public static void main (String[] args) throws java.lang.Exception
  40. {
  41. List<Integer> a = new ArrayList<Integer>();
  42. a.add(4);
  43. a.add(8);
  44. a.add(91);
  45. a.add(18);
  46. double avgDouble = averageValue(a, doubleAvg);
  47. int avgInt = averageValue(a, intAvg);
  48. System.out.println(avgDouble);
  49. System.out.println(avgInt);
  50. }
  51. }
Success #stdin #stdout 0.1s 320256KB
stdin
Standard input is empty
stdout
30.25
30