欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK8 Optional

程序员文章站 2022-06-07 20:08:44
...

JDK8 Optional

我们经常会在代码里去判断对象是否为null,以避免NPE的问题。JDK8提供了Optional类配合函数编程和流式编程去更加优雅的处理Optional。

一、API

Optional的构造函数被private修饰了,即只能用它提供的2个静态方法创建对象:

of(T t)  只能接受不为null的对象,否则抛异常

ofNullable(T t)  可以接受为null的对象

empty() 返回一个空值的对象,且为单例,每次返回的都是一样的

boolean isPresent() 判断value是否为空,一般不推荐使用,如果使用该方法进行判断,那么和if xx == null 就没有任何区别了

void ifPresent(Consumer<? super T> consumer) 接收一个函数式接口(即只有一个方法,且被@FunctionaInterface修饰),如果

get() 获得value值

值不为空则为调用该接口的方法。

 public void add(Person person) {
        Optional.of(person).ifPresent(list::add);
        /**
         * 等同于代码
         * if (null != person){
         *      list.add(person);
         * }
         */
    }

   orElse(value) 如果为null,返回一个值

public String getName() {
        return Optional.ofNullable(this.name).map(r -> name).orElse("default");
        /**
         * 等同于
         * if (this.name == null){
         *     return "default";
         * }else{
         *     return this.name
         * }
         */
    }

   orElseGet() 通orElse一样,只是参数需要传一个函数

public String getName() {
        return Optional.ofNullable(this.name).map(r -> name).orElseGet(() -> "defualt".toUpperCase());
        /**
         * 等同于
         * if (this.name == null){
         *     return "default".toUpperCase();
         * }else{
         *     return this.name;
         * }
         */
    }

   orElseThrow()

 public String getName() {
        return Optional.ofNullable(this.name).map(r -> name).orElseThrow(()-> new NullPointerException());
        /**
         * 等同于
         * if (this.name == null){
         *     throw new NullPointerException();
         * }else{
         *     return this.name;
         * }
         */
    }

map() 对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)

Optional<String> s = Optional.of(person).map(r -> r.getName());

flatMap() 和map()基本一样,只是传入的函数返回值不同

Optional<String> s1 = Optional.of(person).flatMap(r -> Optional.of(r.getName()));

filter(Predicate):判断Optional对象中保存的值是否满足Predicate,并返回新的Optional。

 Person person = new Person("eragon",30);
        Optional<Person> o1 = Optional.ofNullable(person);
        // 判断age如果大于30才打印
        o1.filter(p -> p.getAge() > 30).ifPresent(System.out::println);

二、如何使用Optional

  1.不要使用isPersent(),因为和使用if判断非空没有区

if (Optional.ofNullable(person).isPresent()) {
            System.out.println(person.getName());
        }

   应该使用

Optional.ofNullable(person).ifPresent(p-> System.out.println(p.getName()));

  2.嵌套的循环if判断非空可以使用,如果是简单的if判断没有太大必要

 if (null != person) {
            if (null != person.getCar()) {
                return person.getCar().getName();
            }
        }
 throw new RuntimeException("a poor man,don't have a car");

  应该使用

 return Optional.ofNullable(person)
                .map(r -> r.getCar())
                .map(c -> c.getName())
                .orElseThrow(()->new RuntimeException("a poor man ,don't have a car"));