• 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
  • 相关阅读:
    selenium+python实现基本自动化测试
    C++ if 语句
    次氯酸双光子聚集诱导发光型分子探针/聚集诱导发光环状多烯类分子/氮杂环聚集诱导发光分子的研究
    SQL Server如何新建作业
    Chapter6:Atomic Accesses
    4.5 数据加密
    互融云农产品追溯系统:区块链存证技术实现双向可追溯
    Vue中使用andt组件a-table列表数据根据点击的表头进行升/降排序-案例
    【手写数据库toadb】SQL字符串如何被数据库认识? 词法语法分析基础原理,常用工具
    纠删码技术在vivo存储系统的演进【上篇】
  • 原文地址:https://blog.csdn.net/GoGleTech/article/details/125556305