码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • JDK8使用Optional避免NullPointerException


    Optional真么好用,真的可以完全替代if判断吗?

    答案是否定的

    举一个最简单的栗子:

    例子1:

    如果我只想判断对象的某一个变量是否为空并且做出判断呢?

    Person person=new Person();
    person.setName("");
    persion.setAge(2);
    //普通判断
    if(StringUtils.isNotBlank(person.getName())){
      //名称不为空执行代码块
    }
    
    //使用Optional做判断
    Optional.ofNullable(person).map(p -> p.getName()).orElse("name为空");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    只是一个很简单判断,如果用了Optional我们还需要考虑包装值,考虑代码书写,考虑方法调用,虽然只有一行,但是可读性并不好,如果别的程序员去读,我觉得肯定没有if看的明显

    Optional的使用:

    public class Test {
    
        public static void main(String[] args) {
            Person person=new Person();
            person.setAge(2);
            person.setName("名字");
            // 获取包装前的对象
            Object obj = Optional.ofNullable(person).get();
    
            // 判断是否为空,不为空打印年龄
            Optional.ofNullable(person).ifPresent(p -> System.out.println("年龄:" + p.getAge()));
    
            // 这是person的包装对象,或者是Optional<?> EMPTY
            Optional<Person> optionalPerson = Optional.ofNullable(person).filter(item -> item.getAge() < 50);
    
            // 获取person的name属性
            String name = Optional.ofNullable(person).map(p -> person.getName()).orElse("name为空");
            System.out.println(name);
    
            // 获取name属性的Optional包装对象
            Optional<Object> optName = Optional.ofNullable(person).map(p -> Optional.ofNullable(p.getName()).orElse("name为空"));
            System.out.println(optName);
    
            // Supplier也是创建对象的一种方式,简单来说,Suppiler是一个接口,是类似Spring的懒加载,声明之后并不会占用内存,只有执行了get()方法之后,
            // 才会调用构造方法创建出对象创建对象的语法的话就是Supplier supPerson= Person::new;需要使用时supPerson.get()即可
            Optional<Supplier<Person>> sup = Optional.ofNullable(Person::new);
            Optional.ofNullable(person).orElseGet(sup.get());
    
            // 对象为空抛异常
            Optional.ofNullable(null).orElseThrow(() -> new RuntimeException("没有查询的相关数据"));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    public class Person {
        private String name;
        private Integer age;
    
        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    
        public Person() {
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    搞定面试官 - 可以介绍一下 MySQL InnoDB 引擎的索引模型嘛?
    面试官:一个 SpringBoot 项目能处理多少请求?(小心有坑)
    R语言ggplot2可视化:使用ggpubr包的ggbarplot函数可视化柱状图、使用label.pos参数在柱状图上方添加柱状图大小的数值标签
    Postgresql on conflict do update 设置当前值,原始值,当前值与原始值相加值
    zookeeper核心源码分析
    【Rust日报】2022-07-15 Rust 宏定义,拯救运行时错误
    k8s集群使用Yaml部署Nacos集群
    MySQL 事务-学习记录
    PowerCLi VMware vCenter 通过自建的PXE Server一键批量部署常规New-VM
    Spring Boot 拦截器 HandlerInterceptor的使用以及WebMvcConfigurer简单介绍
  • 原文地址:https://blog.csdn.net/GoGleTech/article/details/125556305
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号