java8 Optional的使用,Optional实例,使你的代码高大上

java8 Optional的使用,Optional实例,使你的代码高大上

Optional是为了解决空指针异常,本质是一个包含可选值的包装类,或者说是一个容器

实例代码

package com.dume.boot.code;


import java.util.Optional;
/**
 * @author dume
 * @create 2021-09-13 10:53
 *
 *  Optional是为了解决空指针异常,本质是一个包含可选值的包装类,或者说是一个容器
 **/


public class OptionalDemo {
    public static void main(String[] args) {
        Student studentnull = null;
        Student student = new Student("john1",11);
        Student student2 = new Student("john2",22);
        Student student3 = new Student("john3",33);
        Student student4 = new Student("john4",44);

        //isPresent判断值不为空,get返回对象
        System.out.println("*******************isPresent判断值不为空,get返回对象**********************");
        Optional<Student> optional = Optional.ofNullable(student);
        if(optional.isPresent()){
            Student back1 = optional.get();
            System.out.println("back1:"+back1.toString());
        }
        System.out.println("*********************ifPresent判断不为空, 并执行Lambda 表达式********************");
        //ifPresent判断不为空,Consumer(消费者) 参数,如果对象不是空的,就执行传入的 Lambda 表达式
        //注意没有返回值
        optional.ifPresent(u->ifFuction(u));

        System.out.println("*********************orElse判断不为空,否则返回默认值********************");
        //orElse判断不为空,否则返回默认值
        Student back2 =  Optional.ofNullable(studentnull).orElse(student2);
        System.out.println("back2:"+back2.toString());

        System.out.println("*******************orElseGet不为空时返回值;为空时作为参数传入函数式接口,并返回执行后的参数**********************");
        //orElseGet不为空时返回值;为空时,他会作为参数传入Supplier(供应者) 函数式接口,并返回执行后的参数
        Student back3 = Optional.ofNullable(studentnull).orElse(createStudent());
        Student back4 = Optional.ofNullable(studentnull).orElseGet(()->createStudent());
        System.out.println("back3:"+back3.toString());
        System.out.println("back4:"+back4.toString());
        /**
         * 可见当都为空时,orElse与orElseGet并无差别
         * 当都不为空时,orElse依然会执行,orElseGet不会执行。所以orElseGet效率更高
         */
        System.out.println("*********************当都不为空时,orElse依然会执行,orElseGet不会执行********************");
        Student back5 = Optional.ofNullable(student).orElse(createStudent());
        Student back6 = Optional.ofNullable(student).orElseGet(()->createStudent());
        System.out.println("back5:"+back5.toString());
        System.out.println("back6:"+back6.toString());

        //orElseThrow当为空时,抛出自定义异常
        System.out.println("*********************orElseThrow当为空时,抛出自定义异常********************");
        try {
            Student back7 = Optional.ofNullable(studentnull).orElseThrow(()-> new IllegalArgumentException());
        }catch (Exception e){
            e.printStackTrace();
        }

        //map转换值,map() 对值调用作为参数的函数,然后将返回的值包装在 Optional
        System.out.println("*********************map转换值********************");
        String back8 = Optional.ofNullable(studentnull).map(u->u.getName()).orElse("DEFUAFT");
        String back9 = Optional.ofNullable(studentnull).map(Student::getName).orElse("DEFUAFT");
        System.out.println("back8:"+back8);
        System.out.println("back9:"+back9);

        //flatMap() 也需要函数作为参数,并对值调用这个函数,然后直接返回结果;其实就是需要传入Optional类型参数,并返回Optional类型
        System.out.println("********************flatMap()转换值 需要传入Optional类型*********************");
        student.setPosition("Position");
        String position = Optional.ofNullable(student)
                .flatMap(u -> u.getPosition()).orElse("defaultPosition");
        System.out.println("back10:"+position);

        //filter() 接受一个 Predicate 参数,返回测试结果为 true 的值。
        // 如果测试结果为 false,会返回一个空的 Optional。
        System.out.println("*******************filter() 接受判断表达式,返回判断结果**********************");
        Optional<Student> optional11 = Optional.ofNullable(student).filter(u->u.getName()!=null&&u.getName().contains("1"));
        System.out.println("back11:"+optional11.isPresent());

        //使用Optional避免空指针来取值
        System.out.println("*******************使用Optional避免空指针来取值**********************");
        String code = Optional.ofNullable(new User())
                .flatMap(User::getAddress)
                .flatMap(Address::getCountry)
                .map(Country::getCode)
                .orElse("defaultcode");
        System.out.println("back12:"+code);
        System.out.println("*****************************************");
    }





    public static Student createStudent(){
        System.out.println("CreateStudent loading......");
        return new Student("Createjohn",0);
    }
    public static  void  ifFuction(Student student){
        System.out.println("ifFuction loading......");

    }

    static  class Student{
        public  String name;
        public  int age;
        public  String position;

        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", position=" + position +
                    '}';
        }

        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public void setPosition(String position) {
            this.position = position;
        }

        public Optional<String> getPosition() {
            return Optional.ofNullable(position);
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }


    }

    static  class User{
        Address address;


        public Optional<Address> getAddress() {
            return Optional.ofNullable(address);
        }

    }
    static  class Address{
        Country country;
        public Optional<Country> getCountry() {
            return Optional.ofNullable(country);
        }

    }
    static class Country{
        String code;

        public String getCode() {
            return code;
        }

        public void setCode(String code) {
            this.code = code;
        }
    }




}

打印

"C:\Program Files\Java\jdk1.8.0_92\bin\java.exe" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:60721,suspend=y,server=n -javaagent:C:\Users\du'me\.IntelliJIdea2019.2\system\captureAgent\debugger-agent.jar -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_92\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_92\jre\lib\rt.jar;D:\ideaworkspaces\boot\target\classes;C:\Users\du'me\.m2\repository\org\springframework\boot\spring-boot-starter-jdbc\2.0.4.RELEASE\spring-boot-starter-jdbc-2.0.4.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\boot\spring-boot-starter\2.0.4.RELEASE\spring-boot-starter-2.0.4.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\boot\spring-boot\2.0.4.RELEASE\spring-boot-2.0.4.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\2.0.4.RELEASE\spring-boot-autoconfigure-2.0.4.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\boot\spring-boot-starter-logging\2.0.4.RELEASE\spring-boot-starter-logging-2.0.4.RELEASE.jar;C:\Users\du'me\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;C:\Users\du'me\.m2\repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;C:\Users\du'me\.m2\repository\org\apache\logging\log4j\log4j-to-slf4j\2.10.0\log4j-to-slf4j-2.10.0.jar;C:\Users\du'me\.m2\repository\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;C:\Users\du'me\.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;C:\Users\du'me\.m2\repository\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;C:\Users\du'me\.m2\repository\org\yaml\snakeyaml\1.19\snakeyaml-1.19.jar;C:\Users\du'me\.m2\repository\com\zaxxer\HikariCP\2.7.9\HikariCP-2.7.9.jar;C:\Users\du'me\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\du'me\.m2\repository\org\springframework\spring-jdbc\5.0.8.RELEASE\spring-jdbc-5.0.8.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\spring-beans\5.0.8.RELEASE\spring-beans-5.0.8.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\spring-tx\5.0.8.RELEASE\spring-tx-5.0.8.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\boot\spring-boot-starter-thymeleaf\2.0.4.RELEASE\spring-boot-starter-thymeleaf-2.0.4.RELEASE.jar;C:\Users\du'me\.m2\repository\org\thymeleaf\thymeleaf-spring5\3.0.9.RELEASE\thymeleaf-spring5-3.0.9.RELEASE.jar;C:\Users\du'me\.m2\repository\org\thymeleaf\thymeleaf\3.0.9.RELEASE\thymeleaf-3.0.9.RELEASE.jar;C:\Users\du'me\.m2\repository\org\attoparser\attoparser\2.0.4.RELEASE\attoparser-2.0.4.RELEASE.jar;C:\Users\du'me\.m2\repository\org\unbescape\unbescape\1.1.5.RELEASE\unbescape-1.1.5.RELEASE.jar;C:\Users\du'me\.m2\repository\org\thymeleaf\extras\thymeleaf-extras-java8time\3.0.1.RELEASE\thymeleaf-extras-java8time-3.0.1.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\boot\spring-boot-starter-web\2.0.4.RELEASE\spring-boot-starter-web-2.0.4.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\boot\spring-boot-starter-json\2.0.4.RELEASE\spring-boot-starter-json-2.0.4.RELEASE.jar;C:\Users\du'me\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.6\jackson-databind-2.9.6.jar;C:\Users\du'me\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\du'me\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.6\jackson-core-2.9.6.jar;C:\Users\du'me\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.6\jackson-datatype-jdk8-2.9.6.jar;C:\Users\du'me\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.6\jackson-datatype-jsr310-2.9.6.jar;C:\Users\du'me\.m2\repository\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.6\jackson-module-parameter-names-2.9.6.jar;C:\Users\du'me\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\2.0.4.RELEASE\spring-boot-starter-tomcat-2.0.4.RELEASE.jar;C:\Users\du'me\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.32\tomcat-embed-core-8.5.32.jar;C:\Users\du'me\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.32\tomcat-embed-el-8.5.32.jar;C:\Users\du'me\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.32\tomcat-embed-websocket-8.5.32.jar;C:\Users\du'me\.m2\repository\org\hibernate\validator\hibernate-validator\6.0.11.Final\hibernate-validator-6.0.11.Final.jar;C:\Users\du'me\.m2\repository\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;C:\Users\du'me\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\du'me\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\du'me\.m2\repository\org\openjfx\javafx.base\11.0.0-SNAPSHOT\javafx.base-11.0.0-20180702.224858-3.jar;C:\Users\du'me\.m2\repository\org\openjfx\javafx.base\11.0.0-SNAPSHOT\javafx.base-11.0.0-20180702.223831-2-linux.jar;C:\Users\du'me\.m2\repository\org\openjfx\javafx.base\11.0.0-SNAPSHOT\javafx.base-11.0.0-20180702.224858-3-mac.jar;C:\Users\du'me\.m2\repository\org\openjfx\javafx.base\11.0.0-SNAPSHOT\javafx.base-11.0.0-20180629.175051-1-win.jar;C:\Users\du'me\.m2\repository\org\springframework\spring-web\5.0.8.RELEASE\spring-web-5.0.8.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\spring-webmvc\5.0.8.RELEASE\spring-webmvc-5.0.8.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\spring-aop\5.0.8.RELEASE\spring-aop-5.0.8.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\spring-context\5.0.8.RELEASE\spring-context-5.0.8.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\spring-expression\5.0.8.RELEASE\spring-expression-5.0.8.RELEASE.jar;C:\Users\du'me\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\du'me\.m2\repository\org\springframework\spring-core\5.0.8.RELEASE\spring-core-5.0.8.RELEASE.jar;C:\Users\du'me\.m2\repository\org\springframework\spring-jcl\5.0.8.RELEASE\spring-jcl-5.0.8.RELEASE.jar;C:\Users\du'me\.m2\repository\org\apache\commons\commons-lang3\3.7\commons-lang3-3.7.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-spring\1.4.0\shiro-spring-1.4.0.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-core\1.4.0\shiro-core-1.4.0.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-lang\1.4.0\shiro-lang-1.4.0.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-crypto-hash\1.4.0\shiro-crypto-hash-1.4.0.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-crypto-core\1.4.0\shiro-crypto-core-1.4.0.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-crypto-cipher\1.4.0\shiro-crypto-cipher-1.4.0.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-config-core\1.4.0\shiro-config-core-1.4.0.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-config-ogdl\1.4.0\shiro-config-ogdl-1.4.0.jar;C:\Users\du'me\.m2\repository\commons-beanutils\commons-beanutils\1.9.3\commons-beanutils-1.9.3.jar;C:\Users\du'me\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-event\1.4.0\shiro-event-1.4.0.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-web\1.4.0\shiro-web-1.4.0.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-ehcache\1.4.0\shiro-ehcache-1.4.0.jar;C:\Users\du'me\.m2\repository\org\apache\shiro\shiro-cache\1.4.0\shiro-cache-1.4.0.jar;C:\Users\du'me\.m2\repository\net\sf\ehcache\ehcache-core\2.6.11\ehcache-core-2.6.11.jar;C:\Users\du'me\.m2\repository\junit\junit\4.13.2\junit-4.13.2.jar;C:\Users\du'me\.m2\repository\mysql\mysql-connector-java\5.1.46\mysql-connector-java-5.1.46.jar;C:\Users\du'me\.m2\repository\org\junit\jupiter\junit-jupiter\5.8.0\junit-jupiter-5.8.0.jar;C:\Users\du'me\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.1.1\junit-jupiter-api-5.1.1.jar;C:\Users\du'me\.m2\repository\org\apiguardian\apiguardian-api\1.0.0\apiguardian-api-1.0.0.jar;C:\Users\du'me\.m2\repository\org\opentest4j\opentest4j\1.0.0\opentest4j-1.0.0.jar;C:\Users\du'me\.m2\repository\org\junit\platform\junit-platform-commons\1.1.1\junit-platform-commons-1.1.1.jar;C:\Users\du'me\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.1.1\junit-jupiter-params-5.1.1.jar;C:\Users\du'me\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.1.1\junit-jupiter-engine-5.1.1.jar;C:\Users\du'me\.m2\repository\org\junit\platform\junit-platform-engine\1.1.1\junit-platform-engine-1.1.1.jar;C:\Program Files\JetBrains\IntelliJ IDEA 2019.2.4\lib\idea_rt.jar" com.dume.boot.code.OptionalDemo
Connected to the target VM, address: '127.0.0.1:60721', transport: 'socket'
*******************isPresent判断值不为空,get返回对象**********************
back1:Student{name='john1', age=11, position=null}
*********************ifPresent判断不为空, 并执行Lambda 表达式********************
ifFuction loading......
*********************orElse判断不为空,否则返回默认值********************
back2:Student{name='john2', age=22, position=null}
*******************orElseGet不为空时返回值;为空时作为参数传入函数式接口,并返回执行后的参数**********************
CreateStudent loading......
CreateStudent loading......
back3:Student{name='Createjohn', age=0, position=null}
back4:Student{name='Createjohn', age=0, position=null}
*********************当都不为空时,orElse依然会执行,orElseGet不会执行********************
CreateStudent loading......
back5:Student{name='john1', age=11, position=null}
back6:Student{name='john1', age=11, position=null}
*********************orElseThrow当为空时,抛出自定义异常********************
java.lang.IllegalArgumentException
	at com.dume.boot.code.OptionalDemo.lambda$main$3(OptionalDemo.java:58)
	at java.util.Optional.orElseThrow(Optional.java:290)
	at com.dume.boot.code.OptionalDemo.main(OptionalDemo.java:58)
*********************map转换值********************
back8:DEFUAFT
back9:DEFUAFT
********************flatMap()转换值 需要传入Optional类型*********************
back10:Position
*******************filter() 接受判断表达式,返回判断结果**********************
back11:true
*******************使用Optional避免空指针来取值**********************
back12:defaultcode
*****************************************
Disconnected from the target VM, address: '127.0.0.1:60721', transport: 'socket'

Process finished with exit code 0

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小七蒙恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值