为了账号安全,请及时绑定邮箱和手机立即绑定

Optional让代码更简单

标签:
Java

Optional是java8引入的新api。他有效的处理了if对空指针等情况的判断。让代码更简洁。
我们下面主要针对下个这个类进行操作

class Book {
    public String name;

    public String getName() {
        return name;
    }
}

Optional的创建

Optional的创建有3中。这里只说两种。因为另外一种实在没有找到合适的场景

Optional.ofNullable();
Optional.empty()

第一个是接收一个可以为空的值。
第二个是创建一个空的Optional。

针对空指针取默认值

写程序往往是如果对象是null,可能赋值给一个固定值返回。

        Optional<Book> userOptional = Optional.ofNullable(book);
        String hello = userOptional.map(Book::getName).orElse("hello");
        System.out.println(hello);

这里主要是创建Optional后,先map获取对象的数据,如果是空就会返回hello。
这个在字段少的时候用处可能不明显。但是在嵌套层次比较多的时候。

 userOptional.map(Book::getName).map().map().orElse("hello");

可以在层层取数据的时候用map或者flatmap获取字段数据。最终写成一行,要比不断的写if判断明显省去了不少代码。

针对空指针抛出异常

我们也遇到一种情况,例如判断为空的时候要抛出自定义异常,中断操作。

        Optional<Book> userOptional = Optional.ofNullable(book);
        String error = userOptional.map(Book::getName).orElseThrow(() -> new RuntimeException("name is null"));

过滤出需要的值

如果获取到的值不少null,也有一些匹配的操作在里面,例如找出名字里是张开头的书、

        Optional<Book> userOptional = Optional.ofNullable(book);
        String bookName = userOptional.map(Book::getName).filter((name) -> name.contains("张")).get();
        System.out.println(bookName);

使用filter可以帮助我们做值的过滤

如果存在某个值,就做一些操作

我们判断完值的存在可能需要做一些后续的操作,例如出现了有张的书名的书,就执行购买。

        Optional<Book> userOptional = Optional.ofNullable(book);
        userOptional.map(Book::getName).filter((name) -> name.contains("张")).ifPresent(name -> System.out.println("购买"+name));

ifPresent后面可以跟一个Consumer,可以帮忙做后面的操作内容。

提供需要条件的默认值

如果对象为null,有的时候是可以确定知道返回什么样的值,有的是需要获取当前数据的,需要动态的数值,例如时间戳等等。
optional提供了orElseGet的方法。这个和orElse有一些区别。我们直接看源码。

    public T orElse(T other) {
        return value != null ? value : other;
    }
    
    public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }

orElseGet是可以提供一个Supplier来提供对象的产生。但是orElse是提供对象本身。我们可以根据return的时候可以看出。orElseGet的意思是只有在为null的时候才触发了构造,可以说具有延迟构造对象的作用。

如果存在某个值,就做一些操作,否则做另外一些操作

上面讲了通过ifPresent可以在存在某些值的时候做一些操作。如果有反向操作,就只能依靠ifPresent返回一个bool类型,然后再写if判断。
java9解决了这个问题。

        Optional<Book> userOptional = Optional.ofNullable(book);
        userOptional.map(Book::getName).filter((name) -> name.contains("张")).
                ifPresentOrElse(name -> System.out.println("购买"+name),()->{
                    System.out.println("回家");
                });

加入了ifPresentOrElse,可以多加一个Runnable。用来执行null的时候的情况。

数据stream

这个也是9以后带来的特性。Optional可以转化为流。
转为流能带来更多的方便的操作,对于元素特别多的要返回的时候,原来是做不到这样的效果的,但是stream可以collect。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
1.6万
获赞与收藏
380

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消