package test.language.custome.nest.def; import java.util.ArrayList; import test.language.mvel.MvelFunc; public class ListImp<T> implements List<T> { final ArrayList<T> list; public ListImp() { this.list = new ArrayList<T>(); } public ListImp(ArrayList<T> list) { this.list = list; } // users[1] public T get(int index) { return list.get(index); } // users[1..6] public List<T> get(int from, int to) { ArrayList<T> newList = new ArrayList<T>(); for (int i = from; i <= to; i++) { newList.add(list.get(i)); } return new ListImp<T>(newList); } // users[1,3,6] public List<T> pick(int... indexes) { ArrayList<T> newList = new ArrayList<T>(); for (int i = 0; i <= indexes.length; i++) { newList.add(list.get(indexes[i])); } return new ListImp<T>(newList); } // users[name=wangshilian] public List<T> pick(Method<Boolean, T> expr) { ArrayList<T> newList = new ArrayList<T>(); for (T t : this.list) { if (expr.call(t).value()) { newList.add(t); } } return new ListImp<T>(newList); } public List<T> pick(String expr) { Method<Boolean, T> f = new MvelFunc<Boolean, T>(expr); return this.pick(f); } public List<T> plus(List<T> to) { ArrayList<T> newList = new ArrayList<T>(); newList.addAll(list); newList.addAll(((ListImp<T>) to).list); return new ListImp<T>(newList); } public void foreach(Method<Result, T> expr) { for (T t : this.list) { expr.call(t); } } public Number sum(Method<Number, T> expr) { Number sum = expr.call(this.list.get(0)); for (int i = 1; i < this.list.size(); i++) { sum = sum.plus(expr.call(this.list.get(i))); } return sum; } public Number avg(Method<Number, T> expr) { Number sum = expr.call(this.list.get(0)); for (int i = 1; i < this.list.size(); i++) { sum = sum.plus(expr.call(this.list.get(i))); } return sum.avgBy(this.list.size()); } public Number max(Method<Number, T> expr) { Number max = expr.call(this.list.get(0)); for (int i = 1; i < this.list.size(); i++) { Number n = expr.call(this.list.get(i)); max = max.compareTo(n) > 0 ? max : n; } return max; } public Number min(Method<Number, T> expr) { Number min = expr.call(this.list.get(0)); for (int i = 1; i < this.list.size(); i++) { Number n = expr.call(this.list.get(i)); min = min.compareTo(n) < 0 ? min : n; } return min; } public void foreach(String expr) { Method<Result, T> f = new MvelFunc<Result, T>(expr); this.foreach(f); } public Number sum(String expr) { Method<Number, T> f = new MvelFunc<Number, T>(expr); return this.sum(f); } public Number avg(String expr) { Method<Number, T> f = new MvelFunc<Number, T>(expr); return this.sum(f); } public Number max(String expr) { Method<Number, T> f = new MvelFunc<Number, T>(expr); return this.sum(f); } public Number min(String expr) { Method<Number, T> f = new MvelFunc<Number, T>(expr); return this.sum(f); } }