你的位置:首页 > Java教程

[Java教程]Java LinqCollection 仿Linq的list常用函数


目前支持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;		}				@Override		public 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>() {				@Override				public Integer process(SameNameSinger item) {					return item.getNameIndex();				}						});