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