之前,调用第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");
}

  这是我的第一篇Java文章。学习Java的过程中,既有惊喜,也有失望。以后会继续来分享心得。

--------------我是分隔线---------------

后来发现以上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);
}

这个世界又完善了一步。

---------------我是第2条分隔线--------------------

前面制作了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表达式简化代码一例的更多相关文章

  1. Java使用lamda表达式简化代码

    代码,自然写的越简洁越好啦,写的人舒服,看的人也舒服,一切为了高效. 要把有限的时间花到其它有意思的事情上去. 目的 学习简化代码的思路,使用jdk8新特性lamada表达式. 使用 某接口,只有一个 ...

  2. java的线程、创建线程的 3 种方式、静态代理模式、Lambda表达式简化线程

    0.介绍 线程:多个任务同时进行,看似多任务同时进行,但实际上一个时间点上我们大脑还是只在做一件事情.程序也是如此,除非多核cpu,不然一个cpu里,在一个时间点里还是只在做一件事,不过速度很快的切换 ...

  3. 掌握 Java 8 Lambda 表达式

    Lambda 表达式 是 Java8 中最重要的功能之一.使用 Lambda 表达式 可以替代只有一个函数的接口实现,告别匿名内部类,代码看起来更简洁易懂.Lambda 表达式 同时还提升了对 集合 ...

  4. Java 8 Lambda表达式探险

    为什么?    我们为什么需要Lambda表达式    主要有三个原因:    > 更加紧凑的代码      比如Java中现有的匿名内部类以及监听器(listeners)和事件处理器(hand ...

  5. 深入探索Java 8 Lambda表达式

    2014年3月,Java 8发布,Lambda表达式作为一项重要的特性随之而来.或许现在你已经在使用Lambda表达式来书写简洁灵活的代码.比如,你可以使用Lambda表达式和新增的流相关的API,完 ...

  6. Java 8 Lambda表达式

    Java 8 Lambda表达式探险 http://www.cnblogs.com/feichexia/archive/2012/11/15/Java8_LambdaExpression.html 为 ...

  7. 深入浅出 Java 8 Lambda 表达式

    摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等.本文系 OneAPM 工程师编译整理. Java 是一流的面向对象语言,除了部分简 ...

  8. Java 8 Lambda表达式10个示例【存】

    PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...

  9. Java 8 Lambda 表达式

    Lambda 是啥玩意 简单来说,Lambda 就是一个匿名的方法,就这样,没啥特别的.它采用一种非常简洁的方式来定义方法.当你想传递可复用的方法片段时,匿名方法非常有用.例如,将一个方法传递给另外一 ...

随机推荐

  1. 【JAVASCRIPT】ECMAScrip (转)

    部分ECMAScript术语 ECMAScript Sun(现在的Oracle)公司持有着"Java"和"JavaScript"的商标.这就让微软不得不把自己的 ...

  2. Android学习笔记-开关按钮ToggleButton和开关Switch

    本节给大家介绍的Android基本UI控件是:开关按钮ToggleButton和开关Switch,这两个其实都是开关组件,只是后者需要在Android 4.0以后才能使用 所以AndroidManif ...

  3. .NET 微服务和Docker容器

    .NET 微服务:适用于容器化 .NET 应用的体系结构 容器和 Docker 简介 什么是 Docker? Docker 术语 Docker 容器.映像和注册表 为 Docker 容器选择 .NET ...

  4. cxf的使用以及与SSH的整合

    经历过一小段忙碌的时间,终于有时间开始整理项目中曾遇到的技术难点,并不是什么新颖的技术难点,只是自己在这样方面所了解的不健全或者是没有了解透彻,现在都抽时间进行整理. 首先就是需要在ssh的系统中整合 ...

  5. [js高手之路]es6系列教程 - 解构详解

    解构通俗点说,就是通过一种特定格式,快捷的读取对象/数组中的数据的方法, es6之前,我们通过对象名称[键] 读取数据 var User = { 'name' : 'ghostwu', 'age' : ...

  6. 小兴趣:用python生成excel格式座位表

    脚本分两个文件: 1.生成二维随机列表:GenerateLocaltion.py 2.将列表导入excel文件:CreateExcel.py 先上GenerateLocaltion.py: impor ...

  7. 安徽省2016“京胜杯”程序设计大赛_I_恶魔A+B

    恶魔A+B Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 73 Accepted: 17 Description 相信大家 ...

  8. PHP部分问题的总结

    一.php连接sql sever 2005 中文编码转换问题. 这个问题是近期做Yii项目遇到的,而且php项目中用sql server做数据库,就是一个很坑的事,但没办法啊,客户是大爷,得听他的.( ...

  9. 序列化之protobuf与avro对比(Java)

    最近在做socket通信中用到了关于序列化工具选型的问题,在调研过程中开始趋向于用protobuf,可以省去了编解码的过程.能够实现快速开发,且只需要维护一份协议文件即可. 但是调研过程中发现了pro ...

  10. textarea的换行符处理以及正确的在Html中显示

    个人不太喜欢在页面做过多的逻辑处理,贴出java的处理方式 /** * Html转换为TextArea文本 * @return */ public static String HtmlToText(S ...