JDK8 Optional

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"));

3.判断对象是否为空,然后返回对象的某个属性

Optional.ofNullable(user).map(User::getUsername).orElse("没有找到该用户");

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值