前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java之Optional的使用和源码分析

java之Optional的使用和源码分析

作者头像
码农王同学
发布2019-10-30 10:29:20
4560
发布2019-10-30 10:29:20
举报
文章被收录于专栏:后端Coder后端Coder
对于一个从事javaWeb开发的后端人员,对入参校验或多或少都有所了解或者熟悉。

ok,今天自己分享下使用jdk提供的Optional工具类如何使用进行对null的判空操作。还是一贯的风格,先看下示例程序。

代码语言:javascript
复制
public static void main(String[] args) {
      User user = new User().setName("后端Coder").setAge(1);
      Optional<User> userOptional = Optional.ofNullable(user);
      userOptional.ifPresent(System.out::println);
      
    }

    @Data
    @Accessors(chain = true)
    static class User {
        private String name;
        private int age;
        
        User() {
        }
    }

看下面的方法之前,建议你先对这篇文章java的静态工厂方法进行了解下。

这里自己主要使用的是Optional.ofNullable()方法进行校验的,我们看下这个方法的代码好了,继续。

代码语言:javascript
复制
public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
   }

这里主要对传入的值使用了三元运算符进行了null值的判断,若是null,直接调用empty()方法,我们还是先看下empty()所涉及的代码先。若为null直接返回一个空的Optional对象。

代码语言:javascript
复制
    private static final Optional<?> EMPTY = new Optional<>();
    
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
    

ok,我们看下不为空的时候,调用的是of()方法,我们还是直接先看代码好了,代码如下:

代码语言:javascript
复制
public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
  }

调用of()方法,返回一个使用Optional对象包裹的值,通过返回的值我们直接调用get()方法就拿到了我们真正需要的对象数据,比如上面的实例代码中,我们可以通过下方代码的方式进行对象信息数据的输出

代码语言:javascript
复制
 User user = userOptional.get();
 System.out.println("user = " + user);

到这里,基本上我们就上面用到的方法走了整个的代码方式的实现,实际上我们在对数据进行入参校验时,也是自己封装好一个工具类进行使用,既然别人已经封装好了,代码比我们写的整洁有力,还是使用别人的好了。

下面我们继续说下另外一个对null值进行判断的工具类吧,还是先看代码好了,这样比较简洁,有说服力。

代码语言:javascript
复制
 @Test
    public void test(){
        User user=new User();
        if (Objects.nonNull(user)){
            System.out.println("创建的对象不为null");
        }else{
            System.out.println("创建的对象为null");
        }
    }
    @Data
    @Accessors(chain = true)
    static class User {
        private String name;
        private  Integer age;


        public User() {
        }

        public User(String name, Integer age) {
            this.name = name;
            this.age = age;
        }
    }

这里面需要介绍和想要介绍的就是Objects.isNull()和Objects.notNull()方法时代码了,ok,我们继续分析Objects.notNull()方法的代码好了,不扯别的,坏笑。

代码语言:javascript
复制
public static boolean nonNull(Object obj) {
        return obj != null;
    }

就一句话判断obj!=null,哈哈,好像和我们写的没什么区别,接下来我们看下另外一个方法,Objects.isNull()方法的代码

代码语言:javascript
复制
 public static boolean isNull(Object obj) {
        return obj == null;
   }

也是一句话,希望可以帮助到你,喜欢的转发,分享,关注一下哈。

代码语言:javascript
复制
 @Test
    public void test() {
        User user = null;
        Objects.requireNonNull(user,"创建的对象实例为null");
    }
    在这里手动模拟一下创建的对象实例为null的情况,主要是想让你看下
    Objects.requireNonNull()方法的使用

我们继续看下这个方法的代码好了。

代码语言:javascript
复制
 public static <T> T requireNonNull(T obj, String message) {
        if (obj == null)
            throw new NullPointerException(message);
        return obj;
    }

这里面对传入的值进行null值的比较,若为null,直接抛出NPE异常信息,现在对入参判断的方法,我们大致上看完了,接下来我们看下其它的方法好了。

Tips:左右滑动可以看到完整代码。

代码语言:javascript
复制
 @Test
 public void test(){
        int compare = Objects.compare(1, 2, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
    });
    System.out.println("compare = " + compare);//compare = -1
    }

上面我们使用到了Objects.compare()方法,对传入的数据使用内部类方式进行比较。

接下来我们看看其它的方法吧,文章到这边也差不多就要说完了。

代码语言:javascript
复制
 boolean flag = Objects.equals(1, 1);
 System.out.println("flag = " + flag);//flag=true

好的,再看下这两个方法的代码。

代码语言:javascript
复制
public static <T> int compare(T a, T b, Comparator<? super T> c) {
        return (a == b) ? 0 :  c.compare(a, b);
    }

使用三元运算符进行判断,不满足条件的时候使用compare()方法进行再判断,其实内部调用的是传统的写法。

下面看下Objects.equals()方法的代码,对两个对象的引用地址进行判断,然后是值得判断。是不是和这篇文章的内容很像java面试篇之equals和==的区别究竟在哪?,你懂了吧,喜欢的可以看下和分享下。

代码语言:javascript
复制
 public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农王同学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档