java之Optional的使用和源码分析
- 2019 年 10 月 30 日
- 筆記
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)); }