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();
    				}			
    			});
    

      

     

  • 相关阅读:
    CSS-DAY03
    Java语言支持的8种基本数据类型
    Linux目录结构
    面向对象的四个基本特征
    使用AVADA头部有搜索icon怎么去掉?
    在ubuntu 上使用apt-get安装 任意版本
    ubuntu 14.04 nginx 1.12.2 配置https遇见的坑
    java Process执行linux命令
    node.js 接收上传的文件
    node.js 进行http get 向服务端请求
  • 原文地址:https://www.cnblogs.com/xiaoqi/p/4764347.html
Copyright © 2011-2022 走看看