optional

空指针异optional常是导致java应用程序失败的最常见原因。以前,为了解决空指针异常,google公司著名的guava项目引入了optional类,guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到google guava的启发,optional类已经成为java 8类库的一部分。optional实际上是个容器:它可以保存类型t的值,或者仅仅保存null。optional提供很多有用的方法,这样我们就不用显式进行空值检测。

1. 以前对null 的处理

    @test
    public void test01(){
        //string username = "张三";
        string username = null;
        if(username != null){
            system.out.println("字符串的长度:" + username.length());
        }else{
            system.out.println("字符串为空");
        }

    }

2. optional类

optional是一个没有子类的工具类,optional是一个可以为null的容器对象,它的主要作用就是为了避免null检查,防止nullpointerexception,

3. optional的基本使用

optional对象的创建方式

    /**
     * optional对象的创建方式
     */
    @test
    public void test02(){
        // 第一种方式 通过of方法  of方法是不支持null的
        optional<string> op1 = optional.of("zhangsan");
        //optional<object> op2 = optional.of(null);

        // 第二种方式通过 ofnullable方法 支持null
        optional<string> op3 = optional.ofnullable("lisi");
        optional<object> op4 = optional.ofnullable(null);

        // 第三种方式 通过empty方法直接创建一个空的optional对象
        optional<object> op5 = optional.empty();

    }

4. optional的常用方法

/**
     * optional中的常用方法介绍
     *   get(): 如果optional有值则返回,否则抛出nosuchelementexception异常
     *          get()通常和ispresent方法一块使用
     *   ispresent():判断是否包含值,包含值返回true,不包含值返回false
     *   orelse(t t):如果调用对象包含值,就返回该值,否则返回t
     *   orelseget(supplier s):如果调用对象包含值,就返回该值,否则返回 lambda表达式的返回值
     */
    @test
    public void test03(){
        optional<string> op1 = optional.of("zhangsan");
        optional<string> op2 = optional.empty();

        // 获取optional中的值
        if(op1.ispresent()){
            string s1 = op1.get();
            system.out.println("用户名称:" +s1);
        }

        if(op2.ispresent()){
            system.out.println(op2.get());
        }else{
            system.out.println("op2是一个空optional对象");
        }

        string s3 = op1.orelse("李四");
        system.out.println(s3);
        string s4 = op2.orelse("王五");
        system.out.println(s4);

        string s5 = op2.orelseget(()->{
            return "hello";
        });
        system.out.println(s5);
    }
    @test
    public void test04(){
        optional<string> op1 = optional.of("zhangsan");
        optional<string> op2 = optional.empty();
        // 如果存在值 就做什么
        op1.ifpresent(s-> system.out.println("有值:" +s));
        op1.ifpresent(system.out::println);
    }

    /**
     * 自定义一个方法,将person对象中的 name 转换为大写 并返回
     */
    @test
    public void test05(){
        person p = new person("zhangsan",18);
        optional<person> op = optional.of(p);
        string name = getnameforoptional(op);
        system.out.println("name="+name);

    }

    /**
     * 根据person对象 将name转换为大写并返回
     *    通过optional方式实现
     * @param op
     * @return
     */
    public string getnameforoptional(optional<person> op){
       if(op.ispresent()){
           string msg = //op.map(p -> p.getname())
                   op.map(person::getname)
                   //.map(p -> p.touppercase())
                   .map(string::touppercase)
                   .orelse("空值");
           return msg;
       }
       return null;
    }

    /**
     * 根据person对象 将name转换为大写并返回
     * @param person
     * @return
     */
    public string getname(person person){
        if(person != null){
            string name = person.getname();
            if(name != null){
                return name.touppercase();
            }else{
                return null;
            }
        }else{
            return null;
        }
    }

到此这篇关于java jdk8新增optional工具类讲解的文章就介绍到这了,更多相关java optional工具类内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!