求求你,不要再使用!=null判空了!

/**
*?@author?Axin
*?@since?2020-09-20
*?@summary?一個(gè)User類定義
?*?(Ps:Data 是lombok組件提供的注解,簡(jiǎn)化了get set等等的約定代碼)
*/
@Data
public?class?User?{
????private?String?name;
????private?String?gender;
????private?School?school;
????@Data
????public?static?class?School?{
????????private?String?scName;
????????private?String?adress;
????}
}
public?static?void?main(String[]?args)?{
????User?axin?=?new?User();
????User.School?school?=?new?User.School();
????axin.setName("hello");
????if?(Objects.nonNull(axin)?&&?Objects.nonNull(axin.getSchool()))?{
????????User.School?userSc?=?axin.getSchool();
????????System.out.println(userSc.getAdress());
????}
}
public?static?void?main(String[]?args)?{
????User?axin?=?new?User();
????User.School?school?=?new?User.School();
????axin.setName("hello");
????//?1.?基本調(diào)用
????String?value1?=?OptionalBean.ofNullable(axin)
????????????.getBean(User::getSchool)
????????????.getBean(User.School::getAdress).get();
????System.out.println(value1);
}

/**
*?@author?Axin
*?@since?2020-09-10
*?@summary?鏈?zhǔn)秸{(diào)用?bean?中?value?的方法
*/
public?final?class?OptionalBean{
????private?static?final?OptionalBean>?EMPTY?=?new?OptionalBean<>();
????private?final?T?value;
????private?OptionalBean()?{
????????this.value?=?null;
????}
????/**
?????*?空值會(huì)拋出空指針
?????*?@param?value
?????*/
????private?OptionalBean(T?value)?{
????????this.value?=?Objects.requireNonNull(value);
????}
????/**
?????*?包裝一個(gè)不能為空的?bean
?????*?@param?value
?????*?@param?
?????*?@return
?????*/
????public?static??OptionalBean ?of(T?value)?{
????????return?new?OptionalBean<>(value);
????}
????/**
?????*?包裝一個(gè)可能為空的?bean
?????*?@param?value
?????*?@param?
?????*?@return
?????*/
????public?static??OptionalBean ?ofNullable(T?value)?{
????????return?value?==?null???empty()?:?of(value);
????}
????/**
?????*?取出具體的值
?????*?@param?fn
?????*?@param?
?????*?@return
?????*/
????public?T?get()?{
????????return?Objects.isNull(value)???null?:?value;
????}
????/**
?????*?取出一個(gè)可能為空的對(duì)象
?????*?@param?fn
?????*?@param?>
?????*?@return
?????*/
????public?>?OptionalBean >?getBean(Function? super?T,???extends?R>?fn)?{
????????return?Objects.isNull(value)???OptionalBean.empty()?:?OptionalBean.ofNullable(fn.apply(value));
????}
????/**
?????*?如果目標(biāo)值為空?獲取一個(gè)默認(rèn)值
?????*?@param?other
?????*?@return
?????*/
????public?T?orElse(T?other)?{
????????return?value?!=?null???value?:?other;
????}
????/**
?????*?如果目標(biāo)值為空?通過lambda表達(dá)式獲取一個(gè)值
?????*?@param?other
?????*?@return
?????*/
????public?T?orElseGet(Supplier?extends?T> other)?{
????????return?value?!=?null???value?:?other.get();
????}
????/**
?????*?如果目標(biāo)值為空?拋出一個(gè)異常
?????*?@param?exceptionSupplier
?????*?@param?
?????*?@return
?????*?@throws?X
?????*/
????public?? T?orElseThrow(Supplier?extends?X>?exceptionSupplier)?throws?X?{
????????if?(value?!=?null)?{
????????????return?value;
????????}?else?{
????????????throw?exceptionSupplier.get();
????????}
????}
????public?boolean?isPresent()?{
????????return?value?!=?null;
????}
????public?void?ifPresent(Consumer?super?T> consumer)?{
????????if?(value?!=?null)
????????????consumer.accept(value);
????}
????@Override
????public?int?hashCode()?{
????????return?Objects.hashCode(value);
????}
????/**
?????*?空值常量
?????*?@param?
?????*?@return
?????*/
????public?static?OptionalBean ?empty()?{
????????@SuppressWarnings("unchecked")
????????OptionalBean?none?=?(OptionalBean )?EMPTY;
????????return?none;
????}
}
public?static?void?main(String[]?args)?{
????User?axin?=?new?User();
????User.School?school?=?new?User.School();
????axin.setName("hello");
????//?1.?基本調(diào)用
????String?value1?=?OptionalBean.ofNullable(axin)
????????????.getBean(User::getSchool)
????????????.getBean(User.School::getAdress).get();
????System.out.println(value1);
????//?2.?擴(kuò)展的?isPresent方法?用法與?Optional?一樣
????boolean?present?=?OptionalBean.ofNullable(axin)
????????????.getBean(User::getSchool)
????????????.getBean(User.School::getAdress).isPresent();
????System.out.println(present);
????//?3.?擴(kuò)展的?ifPresent?方法
????OptionalBean.ofNullable(axin)
????????????.getBean(User::getSchool)
????????????.getBean(User.School::getAdress)
????????????.ifPresent(adress?->?System.out.println(String.format("地址存在:%s",?adress)));
????//?4.?擴(kuò)展的?orElse
????String?value2?=?OptionalBean.ofNullable(axin)
????????????.getBean(User::getSchool)
????????????.getBean(User.School::getAdress).orElse("家里蹲");
????System.out.println(value2);
????//?5.?擴(kuò)展的?orElseThrow
????try?{
????????String?value3?=?OptionalBean.ofNullable(axin)
????????????????.getBean(User::getSchool)
????????????????.getBean(User.School::getAdress).orElseThrow(()?->?new?RuntimeException("空指針了"));
????}?catch?(Exception?e)?{
????????System.out.println(e.getMessage());
????}
}

往期推薦
這8種常見的SQL錯(cuò)誤用法,你還在用嗎?
千萬不要這樣寫代碼!9種常見的OOM場(chǎng)景演示
用好MySQL的21個(gè)好習(xí)慣!
關(guān)注我,每天陪你進(jìn)步一點(diǎn)點(diǎn)!




