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

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

  1. java 集合框架(List操作)

    /*list 基本操作 * * List a=new List(); * 增 * a.add(index,element);按指定位置添加,其余元素依次后移 * addAll(index,Collec ...

  2. 关于java集合的一些操作

    1.数组转集合 java提供了一个方法:Arrays.asList(T... a)的方法. 测试: String[] arr = {"Lida","huanda" ...

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

    /*TreeSet * treeSet存入数据后自动调用元素的compareTo(Object obj) 方法,自动对数据进行排序 * 所以输出的数据是经过排序的数据 * 注:compareTo方法返 ...

  4. Java自学-Lambda 聚合操作

    java 集合的聚合操作 步骤 1 : 传统方式与聚合操作方式遍历数据 遍历数据的传统方式就是使用for循环,然后条件判断,最后打印出满足条件的数据 for (Hero h : heros) { if ...

  5. Java的Stream流式操作

    前言 最近在实习,在公司看到前辈的一些代码,发现有很多值得我学习的地方,其中有一部分就是对集合使用Stream流式操作,觉得很优美且方便.所以学习一下Stream流,在这里记录一下. Stream是什 ...

  6. java集合的操作(set,Iterator)

    集合的操作 Iterator.Collection.Set和HashSet关系 Iterator<——Collection<——Set<——HashSet Iterator中的方法: ...

  7. JAVA 集合操作总结

    1.Collection 1.基本操作 对集合的基础操作 1.boolean add(Object o) //添加对象到集合 2.boolean remove(Object o) //删除指定的对象 ...

  8. JAVA集合操作异常 ---------Collections.unmodifiableCollection

    1.问题原因 这两天在做开发的时候,在一个首页的列表哪里操作了ArrayList集合,在做递归删除的时候用的是Iterator对象(至于为什么用,来个链接https://blog.csdn.net/m ...

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

    package com.swift; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; ...

随机推荐

  1. Android程序安装后在模拟器上不显示,并且控制台显示The launch will only sync the application package on the device!

    初学安卓,今天写了一个小例子,可是eclipse控制台却提示 No Launcher activity found! The launch will only sync the application ...

  2. -_-#【HTML】同一个标签页打开

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. Bzoj 2241: [SDOI2011]打地鼠 暴力,枚举,贪心

    2241: [SDOI2011]打地鼠 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1022  Solved: 651[Submit][Status ...

  4. hdu 4717 The Moving Points(三分+计算几何)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4717 说明下为啥满足三分: 设y=f(x) (x>0)表示任意两个点的距离随时间x的增长,距离y ...

  5. UVA - 10785 The Mad Numerologist

    题目链接 这个题又犯了省题不清的错误.导致不停 wa.唉. 题目意思是给你一个长度L,然后和一张表相应每一个大写字母的value值.你须要依照一定规则找出长度为L的序列. 注意  序列的value值要 ...

  6. android 56

    ##其他布局 * LinearLayout * RelativeLayout * FrameLayout * AbsoluteLayout (绝对布局, 文档说过时,应用场景机顶盒开发,定制的平板) ...

  7. Qt 学习之路:元素布局

    上一章我们介绍了 QML 中用于定位的几种元素,被称为定位器.除了定位器,QML 还提供了另外一种用于布局的机制.我们将这种机制成为锚点(anchor).锚点允许我们灵活地设置两个元素的相对位置.它使 ...

  8. Excel VBA批量修改文件夹下的文件名

    今天,有同事提出想批量修改文件名,规则比较简单,在第五位后加“-”即可, 上网没找到相关工具,就自己做了个excel,用宏代码修改. 代码如下: Private Sub CommandButton1_ ...

  9. 首页在linux下的哪个文件夹

    /data/mindo/tomcat-live/webapps/ROOT/WEB-INF/templates/default/pages/index.jsp   svn检出地址 https://sif ...

  10. Java基础知识强化之集合框架笔记24:ArrayList存储自定义对象并遍历

    1. ArrayList存储自定义对象并遍历 2. 代码示例: Student.java,如下: package cn.itcast_01; public class Student { privat ...