在日常的编程过程中,经常要处理数据集合。对数据集合处理一般采用下面的接口:
/**
* 得到集合方法,传入当前页,和每页的大小
*
* @param curPage
* @param pageSize
* @return
*/
public List<T> getList(int curPage, int pageSize)
上面的处理过程,即大家通常所说的分页;一般显示的时候,使用上面的方法就可以了,但是,如果要对集合中的全部数据处理呢?一般情况下,会出现下面的代码:
int curPage = 1;
int pageSize = 100;
int count = XXXService.getXXXCount();
int lastPage = count / pageSize + 1;
while (lastPage >= curPage) {
List<XXXType> lists = xxxxService.getXxxxByYyy(curPage,pageSize);
if (lists == null) {
break;
}
for (T obj : lists) {
//对其中的一个进行处理
}
curPage++;
}
那么,能不能把上面的代码变成一个通用的模式(工具),然后很简单的使用,不用每次都这样的重复呢?
让我们分析一下,上面情况下,什么是可变的,什么是不变的?
1、总体的流程是不变的;
2、得到当前页的list和对其中一个进行处理是可变的
分析到这里,可能很多人想到了模板方法类解决这个问题,在spring jdbc中大量使用了这种方法;具体实现时,有2种选择,一个是使用抽象来完成过程1,使用子类来完成过程2,典型如:jdk中InputStream,第二个,使用接口来完成过程2,使用类来完成过程1,如:Thread和Runable;
下面采用第二种方式来实现;首先定义接口:
public interface ListAction<T> {
/**
* 得到集合方法
*
* @param curPage
* @param pageSize
* @return
* @throws Exception
*/
public List<T> getList(int curPage, int pageSize) throws Exception;
/**
* 处理一个对象
*
* @param t
* @throws Exception
*/
public void process(T t) throws Exception;
}
这个接口中,是分析中可变的部分。再来定义不可变的类:
public class OverListUtil<T> {
private int curPage = 1;
private int pageSize = 100;
private int lastPage = 1;
public void overList(int count, ListAction<T> listAtion) throws Exception {
lastPage = count / pageSize + 1;
while (lastPage >= curPage) {
List<T> lists = listAtion.getList(curPage, pageSize);
for (T obj : lists) {
listAtion.process(obj);
}
curPage++;
}
}
/**
* 得到当前处理的页
*
* @return
*/
public int getCurPage() {
return curPage;
}
public void setCurPage(int curPage) {
this.curPage = curPage;
}
public int getPageSize() {
return pageSize;
}
/**
* 是否是最后一页
*
* @return
*/
public boolean isLastPage() {
return curPage == lastPage;
}
/**
* 设置每页要处理的数量,默认100
*
* @param pageSize
*/
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
}
这个类主要对不可变的部分进行抽象,即模板。
那么,怎么使用呢?和Thread、Runable的实现一样,下面是个例子:
final int count = 5;
final OverListUtil<String> olu = new OverListUtil<String>();
olu.setPageSize(10);
olu.overList(count, new ListAction<String>() {
@Override
public void process(String t) throws Exception {
// 这里是主要处理逻辑
System.out.println("正在处理第" + olu.getCurPage() + "页");
System.out.println("names:" + t);
}
@Override
public List<String> getList(int curPage, int pageSize) throws Exception {
// 这里一般情况下只需要简单的调用服务即可
List<String> names = getServiceNames(curPage, pageSize);
return names;
}
// 下面这个模仿一个服务
private List<String> getServiceNames(int curPage, int pageSize) {
List<String> names = new ArrayList<String>();
int lenght = 1;
if (olu.isLastPage()) {
lenght = count - ((olu.getCurPage() - 1) * olu.getPageSize());
} else {
lenght = olu.getPageSize();
}
for (int i = 0; i < lenght; i++) {
String s = String.valueOf(Math.random() * 100);
names.add(s);
}
return names;
}
});
那么为什么不把OverListUtil的overList 定义为static的呢?因为这里使用了泛型,参见泛型
呵呵,周五了,明天可以好好的玩玩了!祝大家周末愉快!
分享到:
相关推荐
Android分页的模板 ,在开发APP的时候可能用的上,有ajax的应用
javaweb 分页类模板1
自己写的分页类,是通用类,可以直接调用。在struts,spring中都没问题
这个资源是bootstrap分页模板,虽然网上很多,自己留一个做备份
包含 itext-asian-5.2.0.jar itextpdf-5.5.5.jar
Excel填充数据封装(java) 分页写入 方法反射的使用
简单的java mvc模式,包含分页功能
支持模板导出 ,支持分页查询 , 支持大数据量,采用SXSSFWorkbook
resource里面有模板,在junit测试类中修改为本地存在路径即可导出文件,在junit测试类中修改for循环的i可以模拟百万级数据导出。注意common-poi使用的SXSSFWorkbook(这个只支持xlsx)支持缓存导出,但是这个只支持...
利用freemarker 模板生成pdf ,利用easypoi 生成excel(带图片,水印,分页)
本篇文章主要介绍了java根据模板动态生成PDF实例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
通过三种不同的方式(freemarker+jfreechart、xDoc、POI),根据模板创建Word文件。可以动态修改Word中表格(table)、图表(chart)等数据。导入工程后,可直接运行xxxDemo文件,查看文档生成效果。详见压缩包中的...
Java 生成word文件,带样式,带页眉,带页码,带图片,带表格,需要相关iText包,包可在http://download.csdn.net/detail/wuxinxing1981/8055977 链接下载。
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom ...
Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。 设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang...
Aspose.words 实现插入文件,页面设置,替换 表格操作,分页等
本课程适合于各个层次的Java开发人员,对于初级程序员来说,可以在短时间内迅速提高开发能力,掌握流行的技术,把握技术的发展脉络。对于中高级程序员来说,本课程可以在短时间内快速提升个人的开发能力,后期的架构...
Thymeleaf模板引擎的分页演示 怎么跑 在根目录中运行mvn install 运行java -jar target/spring-thymeleaf-pagination-0.0.1-SNAPSHOT.jar 转到 特别感谢实现了计算按钮跨度的算法。
Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom ...