Redian新闻
>
代码优雅之道——Java如何判空

代码优雅之道——Java如何判空

公众号新闻

点击上方Java后端编程”,选择“设为星标

优质文章,及时送达


【干货】ChatGPT 4.0 解锁了,不限制次数提问 !!!
【干货】清华学姐自学的Linux笔记,天花板级别!
【干货】ChatGPT 4.0 国内直接使用,不限制次数 !
【干货】ChatGPT中文版 4.0,人人都能用,快速稳定 !

实际项目中我们会有很多地方需要判空校验,如果不做判空校验则可能产生NullPointerException异常。

针对异常的处理我们在上一篇有提及:

先来看一下实际项目中一些判空方式

通常我们判断一个对象是否为Null,可以使用java.util中的Objects.nonNull(obj)、hutool中的ObjectUtil或者直接 null != obj

List的判空

像List这种比较特殊的在项目中可能不仅仅是判断非空了。对于List来说不等于null和List.size()不等于0是两回事,公司也有实习生常常有把这两个混淆的情况,list不等于null说明已经初始化了,堆内存中有一块属于它的地盘,而size为0说明还没往里面放东西,举个例子说就是不等于null代表我现在有个瓶子,size大于0说明我向瓶子里装水了。

实际项目中也发现有直接用list.isEmpty()去判断的,来看一下源码:

相当于判断瓶子里有没有水(前提是瓶子已经存在,若瓶子不存在,则会抛出NullPointerException异常)。

所以通常情况下会连用list != null && list.size > 0 来判断,或者直接使用HuTool中CollUtil工具的isEmpty。诸如此类的还有Set、Map等

String的判空

这里还是用瓶子与水的概念,String为null时调用equals(String)length() 等操作抛出 java.lang.NullPointerException

针对字符串判空有以下几种方式:

1、大多数人使用的方法之一,直观,方便,但效率低下:

if(a == null || a.equals(""));

2、比较字符串长度,高效:

if(a == null || a.length() == 0);

3、Java SE 6.0 才刚刚开始提供,效率和方法二差不多:

if(a == null || a.isEmpty());

当然还可以使用org.apache.commons.lang.StringUtils工具。

StringUtils.isNotBlank(a);

  • StringUtils.isNotBlank(null) = false
  • StringUtils.isNotBlank("") = false
  • StringUtils.isNotBlank(" ") = false
  • StringUtils.isNotBlank("bob") = true
  • StringUtils.isNotBlank(" bob ") = true

该工具类中还有个isNotEmpty()方法,从注释可以很明显看出二者的差别

StringUtils.isNotEmpty(a);

  • StringUtils.isNotEmpty(null) = false
  • StringUtils.isNotEmpty("") = false
  • StringUtils.isNotEmpty(" ") = true
  • StringUtils.isNotEmpty("bob") = true
  • StringUtils.isNotEmpty(" bob ") = true

Optional

Optional的出现就是用来防止NullpointException的。常见的方法有:

  • .empty() 创建一个空的Optional实例
  • .of(T t): 创建一个Optional 实例,为null时报异常
  • ChatGPT中文网站:https://aigc.cxyquan.com
  • .ofNullable(T t): 若t 不为null,创建Optional 实例,否则创建空实例
  • isPresent(): 判断容器中是否有值
  • ifPresent(Consume lambda) 容器若不为空则执行括号中的Lambda表达式
  • orElse(T t): 获取容器中的元素,若容器为空则返回括号中的默认值
  • orElseGet(Supplier s): 如果调用对象包含值,返回该值,否则返回s 获取的值
  • orElseThrow(): 如果为空,就抛出定义的异常,如果不为空返回当前对象
  • map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
  • flatMap(Function mapper): 与map 类似,要求返回值必须是Optional
  • T get() 获取容器中的元素,若容器为空则抛出NoSuchElement异常

先看个常见的示例:

baseInfo类中有布尔类型的属性,是空返回false,不为空取其值,需要四行。

当使用Optional时,一行搞定,非常的优雅。

4.1 Optional对象的创建

public final class Optional<T> {
    private static final Optional<?> EMPTY = new Optional<>();
    private final T value;
    //可以看到两个构造方格都是private 私有的
    //说明 没办法在外面new出来Optional对象
    private Optional() {
        this.value = null;
    }
    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }
    //这个静态方法大致 是创建出一个包装值为空的一个对象因为没有任何参数赋值
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
    //这个静态方法大致 是创建出一个包装值非空的一个对象 因为做了赋值
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
    //这个静态方法大致是 如果参数value为空,则创建空对象,如果不为空,则创建有参对象
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
}

4.2 使用场景

场景1:在service层中 查询一个对象,返回之后判断是否为空并做处理

图片

场景2:使用Optional 和函数式编程,一行搞定

总结

每种方法的存在必然有适用的场景,有些情况下这种链式编程,虽然代码优雅了。但是,逻辑性没那么明显,可读性有所降低,大家项目中看情况酌情使用。

来源:juejin.cn/post/7224027867084292154

—  —


 ChatGPT中文网站



可以在国内同ChatGPT直接进行对话,支持语音聊天,GPT4.0 和 AI绘图,简直太方便了,今天新注册的直接送4.0提问次数 !


https://aigc.cxyquan.com

   直接扫码体验




微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
命运组合论 第一章 绪论 第二节这一代大学生已经知道如何做一个优雅的人分析了1.5亿行代码发现:AI编程助手降低代码质量翻译抄袭该如何判定?从《唐纳兄妹》中译本维权之争谈起快速移民加拿大通道——SUV联邦创业移民拜托!别再滥用 ! = null 判空了!!年度代码翻车现场 |前端代码评审问题总结LLM巫师,代码预训练是魔杖!UIUC华人团队揭秘代码数据三大好处[第九届机王争霸赛]ATX组——Just purple & white by 安124机长3只关注“顶层架构”和“底线思维”的非典型家长,如何培养出被藤校青睐的孩子?|成长教育之道系列访谈<五>AI也造代码屎山!研究发现GitHub Copilot代码可维护性差,偏爱“无脑重写”而非重构复用已有代码LLM会写代码≠推理+规划!AAAI主席揭秘:代码数据质量太高|LeCun力赞如何判断是哪种病原体感染?自行在家检测靠谱吗?→别再用“! = null”做判空了!Optional更好用!“如何判断一个人,是不是真的适合你”老钱:“不须放屁”如何在SpringBoot中优雅地重试调用第三方API?假如有一分钟在狂笑【最新指南】调整身份时换雇主,移民局如何判定“支薪能力”?如何判断公司是“重用”你,还是“利用”你?AI正在使全球代码质量下降!1.53亿行代码深度分析报告出炉如何判断你的认知在什么层次?如何判断老板是在给你画饼,还是器重你?祖传“屎山代码”终于有解了,GitHub Copilot Chat 下个月全面上线,聊聊天就能看懂代码、捉Bug!全球代码质量骤降,罪魁祸首竟是AI!1.53亿行代码深度分析报告出炉编码数据集生成框架 UnitGen 0.4.0:代码文档生成、测试代码生成如何端详哈尔滨这座城市的优雅?大厂程序员提倡“防御性编程”:故意把代码写得很烂,万一被裁,要确保留下的代码不可维护!Spring Boot 玩一玩代码混淆,防止反编译代码泄露代码屎山噩梦加速来袭,都是AI生成代码的锅?趣图:自己单独写代码 vs 有人看着写代码[电脑] 兼具家居属性,小桌面游戏主机优雅之选—分形工艺Ridge装机分享分析了 1.5 亿行代码发现:AI 编程助手降低代码质量家居自己做过的事系列:电工(1)一幅难忘的小说插图
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。