java集合之鏈式操做

若是用過js/jquery、groovy等語言,大概對這樣的代碼比較熟悉:javascript

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

 這樣的對集合的鏈式操做不只書寫方便,並且更方便閱讀。在java8中使用集合流和lamda表達式也能夠達到這個效果。java

本文提供一個簡單的工具類,用java模擬集合鏈式操做,能夠在非java8-的環境中使用。jquery

使用方法以下:app

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,或者加上並行功能。this

相關文章
相關標籤/搜索