Java通过Lambda表达式实现简化代码
之前,调用第3方服务,每个方法都差不多“长”这样, 写起来啰嗦, 改起来麻烦, 还容易改漏。
public void authorizeRoleToUser(Long userId, List<Long> roleIds) { try { power.authorizeRoleToUser(userId, roleIds); } catch (MotanCustomException ex) { if (ex.getCode().equals(MSUserException.notLogin().getCode())) throw UserException.notLogin(); if (ex.getCode().equals(MSPowerException.haveNoPower().getCode())) throw PowerException.haveNoPower(); throw ex; } catch (MotanServiceException ex) { CatHelper.logEventService("Power-authorizeRoleToUser", "authorizeRoleToUser", ex.getStatus(), ex.getErrorCode(), ex.getMessage()); throw ex; } catch (MotanAbstractException ex) { CatHelper.logEventService("Power-authorizeRoleToUser", "authorizeRoleToUser", ex.getStatus(), ex.getErrorCode(), ex.getMessage()); throw ex; } catch (Exception ex) { CatHelper.logError(ex); throw ex; } }
我经过学习和提取封装, 将try ... catch ... catch .. 提取为公用, 得到这2个方法:
import java.util.function.Supplier; public static <T> T tryCatch(Supplier<T> supplier, String serviceName, String methodName) { try { return supplier.get(); } catch (MotanCustomException ex) { if (ex.getCode().equals(MSUserException.notLogin().getCode())) throw UserException.notLogin(); if (ex.getCode().equals(MSPowerException.haveNoPower().getCode())) throw PowerException.haveNoPower(); throw ex; } catch (MotanServiceException ex) { CatHelper.logEventService(serviceName + "-" + methodName, methodName, ex.getStatus(), ex.getErrorCode(), ex.getMessage()); throw ex; } catch (MotanAbstractException ex) { CatHelper.logEventService(serviceName + "-" + methodName, methodName, ex.getStatus(), ex.getErrorCode(), ex.getMessage()); throw ex; } catch (Exception ex) { CatHelper.logError(ex); throw ex; } } public static void tryCatch(Runnable runnable, String serviceName, String methodName) { tryCatch(() -> { runnable.run(); return null; }, serviceName, methodName); }
现在用起来是如此简洁。像这种无返回值的:
public void authorizeRoleToUser(Long userId, List<Long> roleIds) { tryCatch(() -> { power.authorizeRoleToUser(userId, roleIds); }, "Power", "authorizeRoleToUser"); }
还有这种有返回值的:
public List<RoleDTO> listRoleByUser(Long userId) { return tryCatch(() -> power.listRoleByUser(userId), "Power", "listRoleByUser"); }
后来发现以上2个方法还不够用, 原因是有一些方法会抛出 checked 异常, 于是又再添加了一个能处理异常的, 这次意外发现Java的throws也支持泛型, 赞一个:
public static <T, E extends Throwable> T tryCatchException(SupplierException<T, E> supplier, String serviceName, String methodName) throws E { try { return supplier.get(); } catch (MotanCustomException ex) { if (ex.getCode().equals(MSUserException.notLogin().getCode())) throw UserException.notLogin(); if (ex.getCode().equals(MSPowerException.haveNoPower().getCode())) throw PowerException.haveNoPower(); throw ex; } catch (MotanServiceException ex) { CatHelper.logEventService(serviceName + "-" + methodName, methodName, ex.getStatus(), ex.getErrorCode(), ex.getMessage()); throw ex; } catch (MotanAbstractException ex) { CatHelper.logEventService(serviceName + "-" + methodName, methodName, ex.getStatus(), ex.getErrorCode(), ex.getMessage()); throw ex; } catch (Exception ex) { CatHelper.logError(ex); throw ex; } } @FunctionalInterface public interface SupplierException<T, E extends Throwable> { /** * Gets a result. * * @return a result */ T get() throws E; }
为了不至于维护两份catch集, 将原来的带返回值的tryCatch改为调用tryCatchException:
public static <T> T tryCatch(Supplier<T> supplier, String serviceName, String methodName) { return tryCatchException(() -> supplier.get(), serviceName, methodName); }
这个世界又完善了一步。
前面制作了3种情况:
1.无返回值,无 throws
2.有返回值,无 throws
3.有返回值,有 throws
不确定会不会出现“无返回值,有throws“的情况。后来真的出现了!依样画葫芦,弄出了这个:
public static <E extends Throwable> void tryCatchException(RunnableException<E> runnable, String serviceName, String methodName) throws E { tryCatchException(() -> { runnable.run(); return null; }, serviceName, methodName); } @FunctionalInterface public interface RunnableException<E extends Throwable> { void run() throws E; }
完整代码
package com.company.system.util; import java.util.function.Supplier; import org.springframework.beans.factory.BeanCreationException; import com.company.cat.monitor.CatHelper; import com.company.system.customException.PowerException; import com.company.system.customException.ServiceException; import com.company.system.customException.UserException; import com.company.hyhis.ms.user.custom.exception.MSPowerException; import com.company.hyhis.ms.user.custom.exception.MSUserException; import com.company.hyhis.ms.user.custom.exception.MotanCustomException; import com.weibo.api.motan.exception.MotanAbstractException; import com.weibo.api.motan.exception.MotanServiceException; public class ThirdParty { public static void tryCatch(Runnable runnable, String serviceName, String methodName) { tryCatch(() -> { runnable.run(); return null; }, serviceName, methodName); } public static <T> T tryCatch(Supplier<T> supplier, String serviceName, String methodName) { return tryCatchException(() -> supplier.get(), serviceName, methodName); } public static <E extends Throwable> void tryCatchException(RunnableException<E> runnable, String serviceName, String methodName) throws E { tryCatchException(() -> { runnable.run(); return null; }, serviceName, methodName); } public static <T, E extends Throwable> T tryCatchException(SupplierException<T, E> supplier, String serviceName, String methodName) throws E { try { return supplier.get(); } catch (MotanCustomException ex) { if (ex.getCode().equals(MSUserException.notLogin().getCode())) throw UserException.notLogin(); if (ex.getCode().equals(MSPowerException.haveNoPower().getCode())) throw PowerException.haveNoPower(); throw ex; } catch (MotanServiceException ex) { CatHelper.logEventService(serviceName + "-" + methodName, methodName, ex.getStatus(), ex.getErrorCode(), ex.getMessage()); throw ex; } catch (MotanAbstractException ex) { CatHelper.logEventService(serviceName + "-" + methodName, methodName, ex.getStatus(), ex.getErrorCode(), ex.getMessage()); throw ex; } catch (Exception ex) { CatHelper.logError(ex); throw ex; } } @FunctionalInterface public interface RunnableException<E extends Throwable> { void run() throws E; } @FunctionalInterface public interface SupplierException<T, E extends Throwable> { T get() throws E; } }
到此这篇关于Java通过Lambda表达式实现简化代码的文章就介绍到这了,更多相关Java简化代码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot整合Echarts绘制静态数据柱状图和饼图
这篇文章给大家介绍了SpringBoot整合Echarts绘制静态数据柱状图和饼图,文中通过代码示例给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下2024-03-03Intellij idea远程debug连接tomcat实现单步调试
这篇文章主要介绍了Intellij idea远程debug连接tomcat实现单步调试,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-05-05面试总结:秒杀设计、AQS 、synchronized相关问题
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧2021-06-06
最新评论