闽公网安备 35020302035485号
一.案例分析
1.1. 结构化的代码
以分页为例子,来感受一下什么是结构化的代码。特别说明一下:public PageData queryBook(BookRequest request) {
// 1. 创建分页对象
PageData pageData = new PageData();
// 2. 计算满足的记录数
int count = bookMapper.queryBookCount(request);
// 3. 为 0,则表示没有符合的数据,直接返回
if (count == 0) {
pageData.setCount(0);
return pageData;
}
// 4. 不为 0,计算记录详情
List<BookDO> bookList = bookMapper.queryBookList(request);
// 堆代码 duidaima.com
// 5. 封装记录总数和
pageData.setCount(count);
pageData.setResult(bookList);
return pageData;
}
代码二、返回总数和分页详情,查询 Pencil 表:public PageData queryPencil(PencilRequest request) {
// 1. 创建分页对象
PageData pageData = new PageData();
// 2. 计算满足的记录数
int count = pencilMapper.queryPencilCount(request);
// 3. 为 0,则表示没有符合的数据,直接返回
if (count == 0) {
pageData.setCount(0);
return pageData;
}
// 4. 不为 0,计算记录详情
List<PencilDO> pencilList = pencilMapper.queryPencilList(request);
// 5. 封装记录总数和
pageData.setCount(count);
pageData.setResult(pencilList);
return pageData;
}
将两段代码进行对比:

public class ServiceResult<T> {
/**
* 请求是否成
*/
private Boolean success;
/**
* 错误码
*/
private String errorCode ;
/**
* 错误信息
*/
private String errorMsg;
/**
* 返回内容
*/
private T content;
......
}
除了上面这个案例以外,在很多工具类库中都十分常见。例如:下面是 hutool 包中的一个工具类。一个 set 集合如果为 null,则创建一个空的集合对象,否则返回原来的集合对象
public static <V> ListenableFuture<V> invokeWithFuture(
Callable<V> callable) {
return gPool.submit(callable);
}
使用如下:@Test
public void invokeWithFuture() throws Execution {
ListenableFuture<String> result =
AsyncInvoke.invokeWithFuture(() -> 'hello');
System.out.println(result.get());
}
() -> 'hello' 作为一个代码块被传入到了方法中。是的,将代码块作为参数传递!函数式编程的好处,让代码变得如此的灵活。困扰我多年的问题终于有了解法了。@SneakyThrows
public static <T> PageData buildPageData(
Callable<Integer> countFunction,
Callable<List<T>> listFunction) {
// 1. 创建分页对象
PageData pageData = new PageData();
// 2. 计算满足的记录数
int count = countFunction.call();
// 3. 为 0,则表示没有符合的数据,直接返回
if (count == 0) {
pageData.setCount(0);
return pageData;
}
// 4. 不为 0,计算记录详情
List<T> resultList = listFunction.call();
// 5. 封装记录总数和
pageData.setCount(count);
pageData.setResult(resultList);
return pageData;
}
补充分页对象代码:@Data
static class PageData<T> {
private int count;
private T result;
}
使用情况:@Test
public void testBuildPageData(String[] args) {
buildPageData(()-> 1, () -> Arrays.asList('1'));
}
第一个参数是求记录数的方法