java之Optional的使用和源码分析

  • 2019 年 10 月 30 日
  • 筆記

对于一个从事javaWeb开发的后端人员,对入参校验或多或少都有所了解或者熟悉。

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

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()方法进行校验的,我们看下这个方法的代码好了,继续。

public static <T> Optional<T> ofNullable(T value) {          return value == null ? empty() : of(value);     }

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

    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()方法,我们还是直接先看代码好了,代码如下:

public static <T> Optional<T> of(T value) {          return new Optional<>(value);    }

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

 User user = userOptional.get();   System.out.println("user = " + user);

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

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

 @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()方法的代码好了,不扯别的,坏笑。

public static boolean nonNull(Object obj) {          return obj != null;      }

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

 public static boolean isNull(Object obj) {          return obj == null;     }

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

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

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

 public static <T> T requireNonNull(T obj, String message) {          if (obj == null)              throw new NullPointerException(message);          return obj;      }

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

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

 @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()方法,对传入的数据使用内部类方式进行比较。

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

 boolean flag = Objects.equals(1, 1);   System.out.println("flag = " + flag);//flag=true

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

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和==的区别究竟在哪?,你懂了吧,喜欢的可以看下和分享下。

 public static boolean equals(Object a, Object b) {          return (a == b) || (a != null && a.equals(b));      }