PIG: 函数式接口让你的代码更优雅和复用性更高
- package com.dj.springtest.service;
-
- import javax.servlet.http.HttpServletResponse;
-
- /**
- * User: ldj
- * Date: 2023/10/15
- * Time: 1:26
- * Description: 有且只有一个抽象方法,但可以定义多个 default 或 static 方法
- */
- @FunctionalInterface
- public interface ExceptionFunction {
-
- void throwException(Integer httpStatus, String errMessage, HttpServletResponse response);
- }
异常信息枚举类
- package com.dj.springtest.constant;
-
- /**
- * User: ldj
- * Date: 2023/10/15
- * Time: 2:25
- * Description: No Description
- */
- public enum ApiErrorEnum {
-
- UNKNOWN_SYSTEM_EXCEPTION(10500,"系统发生未知异常!");
-
- private Integer code;
- private String message;
-
- ApiErrorEnum(Integer code, String message) {
- this.code = code;
- this.message = message;
- }
-
- public String getMessage() {
- return message;
- }
-
- public void setMessage(String message) {
- this.message = message;
- }
-
- public Integer getCode() {
- return code;
- }
-
- public void setCode(Integer code) {
- this.code = code;
- }
-
- }
lamdba表达式实现函数式接口,达到封装一个异常处理的逻辑
- package com.dj.springtest.utils;
-
- import com.dj.springtest.service.ExceptionFunction;
-
- import java.nio.charset.StandardCharsets;
-
- /**
- * User: ldj
- * Date: 2023/10/15
- * Time: 1:45
- * Description: 如果为true,就抛异常,否则不处理
- */
- public class ExceptionUtil {
-
- //返回接口ExceptionFunction的匿名内部类,只使用一次哦!
- public static ExceptionFunction isTrue(Boolean flag) {
-
- //lambda表达式
- return (status, errMessage, response) -> {
- if (flag) {
- if (null != response) {
- response.setStatus(status);
- response.setCharacterEncoding(String.valueOf(StandardCharsets.UTF_8));
- }
- throw new RuntimeException(errMessage);
- }
- };
- }
-
- //确定要抛异常
- public static void doThrow(String errorMsg){
- ExceptionUtil.isTrue(true).throwException(null, errorMsg, null);
- }
- }
测试使用案例
- package com.dj.springtest.demo;
-
- import com.dj.springtest.constant.ApiErrorEnum;
- import com.dj.springtest.utils.ExceptionUtil;
- import org.junit.Test;
- import org.junit.runner.RunWith;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.test.context.SpringBootTest;
- import org.springframework.http.HttpStatus;
- import org.springframework.test.context.junit4.SpringRunner;
-
- import javax.servlet.http.HttpServletResponse;
-
- /**
- * User: ldj
- * Date: 2023/10/15
- * Time: 2:15
- * Description:函数式接口让你的代码更优雅和复用性更高
- */
- @RunWith(SpringRunner.class)
- @SpringBootTest
- public class ExceptionUtilTest {
-
- @Autowired
- private HttpServletResponse response;
-
- @Test
- public void testExceptionFunction() {
- //模拟入参
- boolean flag1 = false;
- boolean flag2 = true;
-
- //1.先看常规写法
- if (flag1) {
- throw new RuntimeException("获取用户信息出错!");
- } else {
- System.out.println("继续执行业务代码...");
- }
-
- //2.函数式写法
- ExceptionUtil.isTrue(flag2).throwException(HttpStatus.INTERNAL_SERVER_ERROR.value(), ApiErrorEnum.UNKNOWN_SYSTEM_EXCEPTION.getMessage(), response);
- }
- }