java优雅的处理空字符串
可以说,在写代码的时候,判断对象是否为空,真的很讨厌啊,有没有?下面这个判空,还只是一层的,如果是好几层的,代码真的丑地不行。
if(student!=null){
student.setBrithCity(new BrithCity("Beijing"));
}
一、Optional类
有人会想到Optional类,于是上面代码变成这样子:
if(Optional.ofNullable(student).isPresent()){
student.setBrithCity(new BrithCity("Beijing"));
}
这种做法,其实和上面没啥区别,真正优雅地做法,是下面这种:
private void show(Student student) {
Optional.ofNullable(student).
ifPresent((stu)-> stu.setBrithCity(new BrithCity("Beijing")));
}
顺带提一嘴,Optional类地orElse()与orElseGet()方法,处理null也不错,这两个方法,在前面的值为null,时都会返回括号里面的内容,但是不同的是,orElse()是传值,orElseGet()是传入一个操作过程,这个例子传入的是方法引用,当然lambda表达式也阔以。
有一点要注意,orElse()方法,不管前面的值是不是null,都会执行括号里面方法,orElseGet()只会在前面为null值才会触发。
Optional.ofNullable(student).orElse(new Student());
Optional.ofNullable(student).orElseGet(Student::new);
二、Objects类
Opentional的orElse(),orElseGet()方法,需要配合ofNullable()方法使用,Obejcts类也有类似的方法:requireNonNullElse(),requireNonNullElseGet(),
注意,orElse()设置默认值时,可以为null,requireNonNullElse则不可以,打开源码可以看到内部对传入的默认值还调用了一个判空方法:requireNonNull()。下面是示例:
String result = Objects.requireNonNullElse(a, "Hello world");
String result = Objects.requireNonNullElseGet(a, ()->new String("HelloWold"));