关于==null、isEmpty()和StrUtil.isBlank()

自己写拦截器代码的时候,比较习惯用==null来判断,但是一对答案,发现老师用的是后两种,遂问了一下豆包,得到答案总结如下:

java 复制代码
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.从请求头中获取token信息
        String token = request.getHeader("authorization");
        //2.如果为空就返回401状态码
        if(StrUtil.isBlank(token)){
            response.setStatus(401);
            return false;
        }
        //3.token不为空则取出用户信息
        Map<Object, Object> userMap = stringRedisTemplate.opsForHash().entries(LOGIN_USER_KEY + token);
        //4.如token能查找不到用户信息则返回错误
        if(userMap.isEmpty()){
            response.setStatus(401);
            return false;
        }
        //5.不为空就将hash转换为UserDTO类
        UserDTO userDTO = BeanUtil.fillBeanWithMap(userMap,new UserDTO(),false);
        //6.保存用户信息到ThreadLocal
        UserHolder.saveUser(userDTO);
        //7.刷新token有效期
        stringRedisTemplate.expire(LOGIN_USER_KEY + token,LOGIN_USER_TTL, TimeUnit.MINUTES);
        //5.放行
        return true;
    }

不同方法的区别

  1. StrUtil.isBlank()兼容null / "" / " "三种无效值。
  2. isEmpty()只能在已有对象上调用,表明对象为空,必须变量不为null才能用。
  3. null只判断 "是不是空指针",不判断内容。

使用规则

  1. 字符串(request.getHeader()\普通String变量)
  • 拿不到数值返回null,而非空串""。
  • 所以优先用Hutool包下的StrUtil.isBlank(str)
  • 或者可以使用原生Java:str == null || str.trim().isEmpty()
  1. 集合/Map(List、HashMap、Redis entries查询结果)
  • Spring RedisTemplate永远不会返回null,查不到数据会返回空集合对象。
  • 所以使用.isEmpty()
  1. 从Redis拿普通的String(opsForValue().get(key))
  • key不存在返回null。
  • 所以判断逻辑和普通字符串一样,使用StrUtil.isBlank(str)

总结

1.只要变量类型是 String,统一用 StrUtil.isBlank,不用纠结;

2.只要变量类型是 Map/List,统一用 .isEmpty(),不用判 null;

3.只有一种特殊情况需要同时判null:自己手动 new 的集合,中途赋值为 null(业务几乎遇不到)。

相关推荐
weixin_3993806913 小时前
TongWeb7.0.4.9M11一键安装脚本(by sy)
java·spring
CallFay云起未来13 小时前
AI客服能不能减少人工回复?从重复咨询到人机协同的落地分析
java·大数据·人工智能·文心一言
我命由我1234513 小时前
Android 开发 - 获取当前设备屏幕的旋转角度
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
Elastic 中国社区官方博客13 小时前
OpenTelemetry Java 扩展:无需分叉 agent 即可自定义追踪
java·大数据·运维·开发语言·数据库·人工智能·elasticsearch
京东云开发者13 小时前
上游给空、下游拿到 -1,我把故障一直追到了 commons-beanutils 的构造函数
java·ai编程
阿无,13 小时前
Java多线程面试题之AQS
java·开发语言
数据狐(Datafox)13 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
摇滚侠13 小时前
《SpringBoot 3:入门与应用实战》第 7 章 AOP 思想与实现 阅读笔记 15
java·spring boot·笔记
风尘小子14 小时前
java静态类使用@Value动态绑定环境变量
java
重生之后端学习14 小时前
239. 滑动窗口最大值[困难]✅
java·数据结构·算法·leetcode·职场和发展