JAVA 使用实用的参数判空技巧Optional与@Valid,告别if 和else

简介: JAVA 使用实用的参数判空技巧Optional与@Valid,告别if 和else

在日常搬砖的日子里,对参数判空是司空见惯的一个环节。


如以下的这种接口:


    @GetMapping("/getMyParam")
    public void test(@RequestParam Map paramMap) {
        String name=null;
        if (null!=paramMap.get("name")){
            name= (String)paramMap.get("name");
        }
        String classRoom=null;
        if (null!=paramMap.get("classRoom")){
            name= (String)paramMap.get("classRoom");
        }
        String nickName=null;
        if (null!=paramMap.get("nickName")){
            nickName= (String)paramMap.get("nickName");
        }
        Integer age=0;
        if (null!=paramMap.get("age")){
            age= Integer.valueOf((String)paramMap.get("age"));
        }
        //判断值都不为空后,安心使用
        User user=new User();
        user.setAge(age);
        user.setName(name);
        //......省略
        System.out.println(user.toString());
    }


不要觉得这种接口是故意写的,真的很多项目里面都是这些,一大批一大批的if else,不管是新项目还是老项目。


看到这一堆的if else,光是判空就占了大幅度的篇幅,这些if else对心里搬砖的负重感无疑是雪上加霜。


那么我们怎么去省略调这些if else呢?



使用 Optional  .



我这篇里不会展开讲解Optional的各种方法的用法,我选择简单粗暴地贴出对上面接口代码使用Optional的重构:


@GetMapping("/getMyParamNew")
    public void testNew(@RequestParam Map paramMap) {
//String phone=null;
// Object  phoneType= Optional.ofNullable(phone).orElseThrow(()->new DataException("数据异常"));
        Object  name= Optional.ofNullable(paramMap.get("name")).orElse("NEW-JC");
        Object age = Optional.ofNullable(paramMap.get("age")).orElse(0);
        User user=new User();
        user.setAge(Integer.valueOf(String.valueOf(age)));
        user.setName(String.valueOf(name));
        System.out.println(user.toString());
    }


小讲解:  ofNullable 配合 orElse 使用,表示,对传入的参数判断是否为空,如果为空,赋予默认值。

 

测试效果(原来的if else 就不测试了,直接测试使用Optional的):


 

1.都传入参时,


image.png


结果:


image.png


2.传入空参时,


image.png


结果(都赋予了默认值):


image.png


还有没有简单的使用方式可以让我们少写校验的呢?


 

@Valid

 

不多说,看代码:


@Data
public class Cat {
    @NotNull(message = "缺少 name 名称 信息")
    @NotEmpty( message ="传入的name为空字符串,请传值")
    private  String name;
    @NotNull(message = "缺少 age 年龄 信息")
    private  Integer age;
    @NotNull(message = "缺少 nickName 昵称 信息")
    @NotEmpty( message ="传入的nickName为空字符串,请传值")
    private  String  nickName;
}


接口:


GET方式


    @GetMapping("/testNullParamGet")
    public void testNullParamGet(@Valid Cat cat) throws Exception {
        System.out.println(cat.toString());
    }


故意传少参数:


image.png

POST 方式 

    @PostMapping("/testNullParamPost")
    public void testNullParamPost(@RequestBody @Valid Cat cat) throws Exception {
        System.out.println(cat.toString());
    }

故意传少参数:image.png

相关文章
|
2月前
|
存储 Java
Java-参数传值
Java-参数传值
25 4
|
2月前
|
Java
【Java每日一题】— —第二十二题:类名作参数进行方法调用的传递问题。
【Java每日一题】— —第二十二题:类名作参数进行方法调用的传递问题。
28 1
|
2月前
|
存储 Java fastjson
Java泛型-4(类型擦除后如何获取泛型参数)
Java泛型-4(类型擦除后如何获取泛型参数)
33 1
|
12天前
|
XML 存储 Java
11:Servlet中初始化参数的获取与应用-Java Web
11:Servlet中初始化参数的获取与应用-Java Web
27 3
|
2月前
|
缓存 算法 安全
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(二)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
22 0
|
2月前
|
缓存 Java C#
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍(一)
【JVM故障问题排查心得】「Java技术体系方向」Java虚拟机内存优化之虚拟机参数调优原理介绍
91 0
|
1天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
16 3
|
1天前
|
Java 编译器 C语言
【Java开发指南 | 第五篇】Java变量类型、参数变量及局部变量
【Java开发指南 | 第五篇】Java变量类型、参数变量及局部变量
8 3
|
6天前
|
Java 测试技术
Java一分钟之-控制流程:if条件语句与switch
【5月更文挑战第8天】本文探讨了Java编程中的`if`和`switch`控制流程语句,强调了常见问题和易错点。对于`if`语句,需注意使用大括号避免逻辑错误,完整比较操作,以及理解`&&`和`||`的短路行为。在`switch`语句中,要注意只能基于常量进行判断,每个`case`后应有`break`,并提供`default`分支。避免错误的策略包括始终使用大括号、确保清晰的条件、进行代码审查和编写单元测试。掌握这些要点对编写高效、可维护的代码至关重要。
14 0
Java一分钟之-控制流程:if条件语句与switch
|
18天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。