一.案例分析
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')); }第一个参数是求记录数的方法