如果用过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. Spark MLBase分布式机器学习系统入门:以MLlib实现Kmeans聚类算法

    1.什么是MLBaseMLBase是Spark生态圈的一部分,专注于机器学习,包含三个组件:MLlib.MLI.ML Optimizer. ML Optimizer: This layer aims ...

  2. ORACLE数据缓冲区DB cache

    DB CACHE是以数据块为单位组织的缓冲区,数据库刚刚启动的时候,DB CACHE中几乎没有用户数据的缓冲,当会话访问数据库中的表或索引时,首先会检查DB CACHE中是否存在该数据,如果不存在,就 ...

  3. Bitmap 与Drawable相互转换

    Drawable 转 Bitmap import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import ...

  4. SRM 410(1-250pt, 1-500pt)

    DIV1 250pt 题意:对于图G,有一些点和边,点中有一些点称为特殊点.问在所有特殊点最终不能处于同一个联通块的条件下,最多能给在图G中添加多少条边. 解法:首先,对于图G,处理出它有哪些联通块, ...

  5. 大众点评网王宏:从.Net迁移向Java平台 - 51CTO.COM

    大众点评网王宏:从.Net迁移向Java平台 - 51CTO.COM 大众点评网王宏:从.Net迁移向Java平台

  6. Google财经

    本博文的主要内容有 .Google财经的介绍   .市场    .新闻 .投资组合新闻   .投资组合 1.Google财经的介绍 https://zh.wikipedia.org/wiki/Goog ...

  7. ngnix 配置

    #运行用户 user www-data;     #启动进程,通常设置成和cpu的数量相等 worker_processes  1; #全局错误日志及PID文件 error_log  /var/log ...

  8. 402. Remove K Digits

    (English version is after the code part) 这个题做起来比看起来容易,然后我也没仔细想,先速度刷完,以后再看有没有改进. 用这个来说: 1 2 4 3 2 2 1 ...

  9. ELK监控系统nginx / mysql慢日志

    ELK监控系统nginx / mysql慢日志 elasticsearch logstash kibana ELK监控系统nginx日志 1.环境准备 centos6.8_64 mini IP:192 ...

  10. 【Android - MD】之RecyclerView的使用

    RecyclerView是Android 5.0新特性--Material Design中的一个控件,它将ListView.GridView整合到一起,可以使用极少的代码在ListView.GridV ...