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

时间: 2024-08-03 07:30:14

java集合之链式操作的相关文章

java 集合框架List操作

/*list 基本操作 * * List a=new List(); * 增 * a.add(index,element);按指定位置添加,其余元素依次后移 * addAll(index,Collection);在从指定位置开始添加一系列元素,其余元素依次后移 * 删 * a.remove(index);删除指定位置元素 * 改 * a.set(index,element);改变指定位置元素 * 查 * a.get(index);得到指定位置元素 * subList(from,to);返回一个L

面向对象之链式操作

链式操作的格式是:$obj->(方法或属性)->(方法或属性)->(方法或属性)...方法或属性一般都是类中定义的函数.下面是一个事例: <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <?php class Student{ private $name; private $age; publ

scala集合和Java集合对应转换操作

用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case, scala.collection.Iterable <=> java.lang.Iterable scala.collection.Iterable <=> java.util.Collection scala.collection.Iterator <=> java.util.{ Iterator, Enumeration } scala.collection.mutable.Buff

java 集合框架(TreeSet操作,自动对数据进行排序,重写CompareTo方法)

/*TreeSet * treeSet存入数据后自动调用元素的compareTo(Object obj) 方法,自动对数据进行排序 * 所以输出的数据是经过排序的数据 * 注:compareTo方法返回值有:负数,零,正数.分别表示小于,等于,大于 * 对于存入自定义的对象元素,要重写元素的compareTo(Object obj)方法 * 元素定义时,需要实现Comparable接口 * */ 1 import java.util.Iterator; 2 import java.util.Tr

java集合的操作

集合的操作 Iterator.Collection.Set和HashSet关系 Iterator<——Collection<——Set<——HashSet Iterator中的方法:hasNext()和next()这里主要讲集合的操作和集合的遍历 import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class main { public static void main(Str

黑马程序员——java——List集合的常规方法操作

List集合的常规方法操作 import java.util.Arraymist; import java.util.Iterator; import java.util.List; public class ListDemos { public static void main(String[] args) { // TODO Auto-generated method stub //创建一个List集合 List list = new ArrayList(); //调用自定义方法向集合中添加

Java对数组的操作(二)——集合与数组的切换

在Java开发中经常遇见集合与数组的互相切换,怎样实现呢,呵呵呵,非常easy: import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class Test { /** * 将Set集合转换为数组 * * @author GaoHuanjie */ private static void s

Java迭代器问题 有100个人围成一个圈从1开始报数,报到14的这个人就要退出,然后其他人重新开始,从1报数,到14退出问:最后剩下的是100人中的第几个人 用listIterator迭代元素,并对集合进行删除操作

package com.swift; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListIterator_baoshu14 { public static void main(String[] args) { /* * 第9题: 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出. * 然后其他人重新开始,从1报数,到14退出.问:最后剩

JAVA 集合操作总结

1.Collection 1.基本操作 对集合的基础操作 1.boolean add(Object o) //添加对象到集合 2.boolean remove(Object o) //删除指定的对象 3.int size() //返回当前集合中元素的数量 4.boolean contains(Object o) //查找集合中是否有指定的对象. 5.boolean isEmpty() //判断集合是否为空 6.Iterator iterator() //返回一个迭代器 操作整个集合的方法 7.b