如果用过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. 重构第三天:提升方法&下移方法

    如果两个子类拥有相同的方法,把它们移动到超类中来 Warning! 但是从子类到父类移动方法的时候要注意, 不要过度采用这种方法,否则会出现继承滥用的情况.如果一个父类A有多个方法,假设m1, m2方 ...

  2. WordPress ‘get_allowed_mime_types’函数安全漏洞(2)

    漏洞名称: WordPress ‘get_allowed_mime_types’函数安全漏洞 CNNVD编号: CNNVD-201309-169 发布时间: 2013-09-13 更新时间: 2013 ...

  3. Nginx windows下搭建过程

    内容列表: 简要介绍 下载安装 配置测试 一.简要介绍 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP ...

  4. 许令波老师的java的IO机制分析文章

    深入分析 Java I/O 的工作机制 I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可 ...

  5. Unity Chan Advanced

    1. 8X MSAA 2. SMAA 3. ViewSpace Outline 4. Unity Chan Skin 5. Shift Toon Lighting 6. DOF 7. Bloom

  6. MongoDB基础知识 02

    MongoDB基础知识 02 6 数据类型 6.1 null : 表示空值或者不存在的字段 {"x":null} 6.2 布尔型 : 布尔类型只有两个值true和false {&q ...

  7. hdoj 2277 Change the ball【找规律】

    Change the ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  8. 【设计模式 - 11】之享元模式(FlyWeight)

    1      模式简介 当系统中存在大量对象时,非常容易造成内存溢出.为了解决这个问题,我们把这些对象中共有的部分抽象出来,如果有相同的业务请求,则直接返回在内存中已有的对象,避免重新创建,这就是享元 ...

  9. jQuery 实现上下,左右滑动

    前几天的任务:http://t.sina.com.cn/  的下滑效果. 渐变移动出足够的空白 -> 淡出最后一个 ->渐变移动出足够的空白 我们要做的是向左移动效果.这个效果用时需添加一 ...

  10. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...