• java集合之链式操作


    如果用过js/jquery、groovy等语言,大概对这样的代码比较熟悉:

    [1,2,3].map(function(d){...}).grep(function(d){...}).join(',')
    

     这样的对集合的链式操作不仅书写方便,而且更方便阅读。在java8中使用集合流和lamda表达式也可以达到这个效果。

    本文提供一个简单的工具类,用java模拟集合链式操作,可以在非java8-的环境中使用。

    使用方法如下:

    new CollectionPipe<Integer>(new Integer[]{1,2,3})
        .filter(new Filter<Integer>(){...})
        .map(new Mapper<Integer,String>(){...})
        .join(",")
    
    /////////////
    
    CollectionPipe.fromArray(new double[]{1.5d,1.6d,2.8d})
        .filter(new Filter<Double>(){...})
         .map(new Mapper<Double,Integer>(){...})
        .join(",")
    

     完整代码为:

    // S--> 集合元素类型
    public class CollectionPipe<S> {
    	List<S> source=new ArrayList<S>();
    	
    	public CollectionPipe() {
    		super();
    	}
    	public CollectionPipe(Collection<? extends S> collection) {
    		super();
    		source.addAll(collection);
    	}
    	public CollectionPipe(S[] array){
    		super();
    		for(S item:array)
    			source.add(item);
    	}
    	
         // O-->映射后集合类型
    	public <O> CollectionPipe<O> map(
    			Mapper<S,O> mapper) {
    		List<O> result=new ArrayList<O>();
    		for(S item:source)
    			result.add(mapper.map(item));
    		return new CollectionPipe<O>(result);
    	}
    	
    	public CollectionPipe<S> filter(Filter<S> filter){
    		Iterator<S> it=source.iterator();
    		while(it.hasNext()){
    			if(!filter.filter(it.next()))
    				it.remove();
    		}
    		return this;
    	}
    	
    	public String join(String seg){
    		String result="";
    		if(source==null)
    			return result;
    		int index=0;
    		for(Object o:source){
    			index++;
    			if(index==source.size())
    				result+=String.valueOf(o);
    			else
    				result+=String.valueOf(o)+seg;
    		}
    		return result;
    	}
    	
    	public List<S> getList() {
    		return source;
    	}
    	
    	public Set<S> getSet(){
    		return new HashSet<S>(source);
    	}
    	
    	public static CollectionPipe<Double> fromArray(double [] array){
    		CollectionPipe<Double> result=new CollectionPipe<>();
    		for(double item:array)
    			result.source.add(item);
    		return result;
    	}
    	
    	public static CollectionPipe<Integer> fromArray(int [] array){
    		CollectionPipe<Integer> result=new CollectionPipe<>();
    		for(int item:array)
    			result.source.add(item);
    		return result;
    	}
    	
    
    }
    
    public interface Mapper<I,O> {
        O map(I item);
    }
    
    //true-->保留;false-->舍弃
    public interface Filter<I> {
        boolean filter(I item);
    }
    

     读者可以自行扩展从不同的源生成pipe,或者加上并行功能。

  • 相关阅读:
    二分查找
    bracketed-paste-magic:zle:41: not enough arguments for -U
    逗号表达式返回值
    requestAnimationFrame实现一帧的函数节流
    phaser常用API总结
    table表头固定问题
    接口防刷的方法
    雪碧图background-position的rem用法
    sphinx 增量索引与主索引使用测试
    msysgit ls 中文显示
  • 原文地址:https://www.cnblogs.com/wuseguang/p/4142946.html
Copyright © 2020-2023  润新知