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));
}