2021
02/28
08:43
文章作者:

什么是Optional类 JDK 8 的optional类

NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方。NPE常是导致Java应用程序失败的最常见的原因。在日常研发工作中,经常会处理各种变量、集合,但在使用的过程中,往往要进行空判断,不然会出现NPE。

Optional类实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional 类的引入很好的解决空指针异常。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。尽量避免在程序中直接调用Optional对象的get()和isPresent()方法,避免使用Optional类型声明实体类的属性。

    Optional.of(T t) : 创建一个 Optional 实例
    Optional.empty() : 创建一个空的 Optional 实例
    Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
    isPresent() : 判断是否包含值
    orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
    orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
    map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()
    flatMap(Function mapper):与 map 类似,要求返回值必须是Optional

 
如何使用Optional类

下面代码在两个常用场景,对比使用Optional类后的代码,可以看出,代码简洁很多。

第一个场景:判断是否为空

    package com.java.bitmap;
     
    import java.util.Optional;
     
    public class OptionalDemo {
     
        public static void main(String[] args) {
            String name="kerry";
            // common way
            if (name!=null&&name.length()!=0){
                System.out.println(name.length());
            }
            //use optional way
            System.out.println(Optional.ofNullable(name).orElse("").length());
     
     
        }
    }

第二个场景:遍历list对象

 

     public static void listIterator(List<Integer> list){
            // common way
            if (list!=null&&list.size()!=0){
                for (Integer tmp:list) {
                    System.out.println(tmp);
                }
            }
            //use optional way
            Optional.ofNullable(list).orElse(new ArrayList<>()).forEach(tmp->{System.out.println(tmp);});
        }

第三个场景:

 

    public User getUser(User user) throws Exception{
        if(user!=null){
            String name = user.getName();
            if("zhangsan".equals(name)){
                return user;
            }
        }else{
            user = new User();
            user.setName("zhangsan");
            return user;
        }
    }

 

    public User getUser(User user) {
        return Optional.ofNullable(user)
                       .filter(u->"zhangsan".equals(u.getName()))
                       .orElseGet(()-> {
                            User user1 = new User();
                            user1.setName("zhangsan");
                            return user1;
                       });
    }

 orElseGet和orElse相似,都可以自定义类型返回,前者支持lamaba表达式。
————————————————1

我们的服务

Our Services

新闻资讯

News Center 更多 +

联系我们

Contact Us

咨询热线:

86-592-5151555

地址: 厦门市集美区软件园三期A3栋504室

QQ:43751419

固话:86-592-5151555

手机:18965424099(黄先生)

官网:www.mdm78.com

微信二维码

Copyright © 2000-2021 www.mdm78.com

闽网文〔2018〕11518-507号 | 闽ICP备17022492号-4

游戏作品版权归原作者享有,如无意之中侵犯了您的版权,请您按照《版权保护投诉指引》来信告知,本网站将应您的要求删除。