zoukankan      html  css  js  c++  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();
    				}			
    			});
    

      

     

  • 相关阅读:
    大数据量问题,按需按实际查询而不是一次加载。
    spring中注解事务认识
    sqlmap文件在tomcat7中运行报错原因及<![CDATA[ ]]>
    网站404,500错误页面的处理,及500异常写入errorLog日志
    javascript div z-index, input tabindex属性说明
    sqlmap映射继承机制及映射字段顺序与SQL查询字段顺序无关
    jquery类选择器无法取得对象问题原因
    linux服务器初步印象,远程连接mysql数据库,传输文件,启动/关闭tomcat命令
    Linux iptables 防火墙详解
    Nginx之location 匹配规则详解
  • 原文地址:https://www.cnblogs.com/xiaoqi/p/4764347.html
Copyright © 2011-2022 走看看