目前支持find,findAll,sort,select,remove等,java不支持lamda函数,因此用接口代替
public interface Fun<T1,T2> {public T2 PRocess(T1 item);}public interface Predicate<T> {/** * 是否满足 * @param item * @return */public boolean evaluate(T item);}
接下来是具体的实现:
public class LinqCollection<T> extends java.util.ArrayList<T> {/** * serialVersionUID */private static final long serialVersionUID = -5042194313851746204L;public LinqCollection(){super();}public LinqCollection(Collection<? extends T> c){super(c);}/** * 查找首条符合条件的记录 * @param predicate 条件 * @return */public T find(Predicate<T> predicate){for(T item: this){if(predicate.evaluate(item)){return item;}}return null;}/** * 按条件删除 * @param predicate */public void remove(Predicate<T> predicate){ ListIterator<T> i = this.listIterator(); while(i.hasNext()){ T c = i.next(); if(predicate.evaluate(c)){ i.remove(); } }}class ComparableItem<T> implements Comparable{T data;Fun<T, ?> keySelect =null;public <T2 extends Comparable<? super T2>> ComparableItem(T item,Fun<T,T2> keySelect){this.keySelect = keySelect;this.data = item;}@Overridepublic int compareTo(Object o) {return ((Comparable)(this.keySelect.process(this.data))).compareTo((Comparable)(this.keySelect.process(((ComparableItem<T>)o).data)));}}/** * 选择 * @param keySelect * @return */public <T2> LinqCollection<T2> select(Fun<T,T2> keySelect){LinqCollection<T2> result = new LinqCollection<T2>();for(T item : this){result.add(keySelect.process(item));}return result;}/** * 按指定字段排序 * @param keySelect(选择排序的字段) */public <T2 extends Comparable<? super T2>> void sort(Fun<T,T2> keySelect){List<ComparableItem<T>> items = Lists.newArrayList();for(T item : this){items.add(new ComparableItem<T>(item, keySelect));} Collections.sort(items); ListIterator i = this.listIterator(); for (int j=0; j<items.size(); j++) { i.next(); i.set(items.get(j).data); }}/** * 查找所有符合条件的记录 * @param predicate * @return */public LinqCollection<T> findAll(Predicate<T> predicate){LinqCollection<T> result = new LinqCollection<T>();for(T item: this){if(predicate.evaluate(item)){result.add(item);}}return result;}/** * 是否存在 * @param predicate * @return */public boolean exist(Predicate<T> predicate){return this.find(predicate)!=null;}}
使用举例:
cleanItems.sort(new Fun<SameNameSinger, Integer>() {@Overridepublic Integer process(SameNameSinger item) {return item.getNameIndex();}});
新闻热点
疑难解答