暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

java8新特性之Optional 类

NIU技术那点事 2019-06-24
1100

     一、   概述

Optional 已经成为 Java 8 类库的一部分,用来解决空指针异常NPE

Optional<T>是一个可以包含或不可以包含非空值的容器对象

二、   介绍常用

  1. 1.     Optional.of(T t)

创建一个Optional实例,若为null,则会引起空指针

  1. 2.     Optional.empty()

创建一个空的Optional实例

  1. 3.     Optional.ofNullable(T t)

若t不为null,创建Optional实例,否则创建空实例

  1. 4.     isPresent()

判断是否包含值,如果值存在则方法会返回true,否则返回 false。

  1. 5.     voidifPresent(Consumer<? super T> consumer)

如果值存在则使用该值调用 consumer , 否则不做任何事情。

  1. 6.     orElse(T t)

如果调用对象包含值,返回该值,否则返回t

  1. 7.     orElseGet(Supplier s)

如果调用对象包含值,返回该值,否则返回s获取的值

  1. 8.     map(Function f)

如果有值对其处理,并返回处理后的Optional,否则返Optional.empty()

  1. 9.     flatMap(Function mapper)

与map类似,要求返回值必须是Optional

  1. 10.  orElseThrow(Supplier<?extends X> exceptionSupplier)

如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常

三、   举例说明

PeopleOptionalTest构建例子。

publicclass People {

    private Integer no;

    private String name;

    private String mobile;

    private Integer age;

    private Double sal;

    public People(){

        this.no=0;

        this.name = "ming";

        this.mobile = "121212121";

        this.age = 28;

        this.sal = 1999999.99;

    }

    public People(String name){

        this.no=1;

        this.name = name;

        this.mobile = "121212121";

        this.age = 28;

        this.sal = 1999999.99;

    }

    public People(Integer no,String name, String mobile, Integer age){

        this.no=2;

        this.name = name;

        this.mobile = mobile;

        this.age = age;

        this.sal = 999999.99;

    }

    public People(Integer no,String name, Integer age,Double sal){

        this.no=no;

        this.name = name;

        this.mobile = "22222222";

        this.age = age;

        this.sal = sal;

    }

    public String getName() {

        returnname;

    }

 

    publicvoid setName(String name) {

        this.name = name;

    }

 

    public String getMobile() {

        returnmobile;

    }

 

    publicvoid setMobile(String mobile) {

        this.mobile = mobile;

    }

    public Integer getAge() {

        returnage;

    }

    publicvoid setAge(Integer age) {

        this.age = age;

    }

    public Double getSal() {

        returnsal;

    }

    publicvoid setSal(Double sal) {

        this.sal = sal;

    }

    public Integer getNo() {

        returnno;

    }

    publicvoid setNo(Integer no) {

        this.no = no;

    }

 

}

 

/**

 * 测试Optional

 *

 */

publicclass OptionalTest {

    publicstaticvoid main(String args[]){

        OptionalTest test = new OptionalTest();

        try{

            test.test1();

        }catch(Exception e){

            System.out.println(e.getMessage());

        }

        try{

            test.test2();

        }catch(Exception e){

            System.out.println(e.getMessage());

        }

        test.test3();

        test.test4();

    }

    //of

    publicvoid test1() {

        Optional<People> op = Optional.of(new People());

        //正常输出

        System.out.println(op.get());

        Optional<People> op1 = Optional.of(null);

        //空指针异常

        System.out.println(op1.get());

    }

    //empty

    publicvoid test2() {

        Optional<People> op = Optional.empty();

        //java.util.NoSuchElementException

        //不会出现空指针异常

        System.out.println(op.get());

    }

    //ofNullableorElse orElseGet

    publicvoid test3() {

        Optional<People> op = Optional.ofNullable(new People());

        //如果有元素,不是空或null

        if(op.isPresent()) {

            System.out.println(op.get());

        }

        People emp = op.orElse(new People("张三"));

        System.out.println(emp);

        //orElse区别在于他接收一个函数式接口,可以写自己逻辑,比如if true

        //返回A对象,else 返回B对象

        People emp2 = op.orElseGet(() -> new People());

        System.out.println(emp2);

    }

    //mapflatMap

    publicvoid test4(){

        Optional<People> op = Optional.of(new People(101, "王五", 18, 9999.99));

       

        Optional<String> op2 = op.map(People ::getName);

        System.out.println(op2.get());

       

        Optional<String> op3 = op.flatMap((e) -> Optional.of(e.getName()));

        System.out.println(op3.get());

    }

}

 

输出结果如下:

com.xhdx.java8.People@2a139a55

null

No value present

com.xhdx.java8.People@15db9742

com.xhdx.java8.People@15db9742

com.xhdx.java8.People@15db9742

王五

王五



关注我们,精彩属于你

文章转载自NIU技术那点事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论