卖产品怎么做网站用什么软件制作网站
web/
2025/9/30 18:16:19/
文章来源:
卖产品怎么做网站,用什么软件制作网站,网站建设网站软件,厂里拿货开小加工厂对于Java程序员来说#xff0c;null是令人头痛的东西。时常会受到空指针异常#xff08;NPE#xff09;的骚扰。连Java的发明者都承认这是他的一项巨大失误。那么#xff0c;有什么办法可以避免在代码中写大量的判空语句呢#xff1f;有人说可以使用 JDK8提供的 Optional … 对于Java程序员来说null是令人头痛的东西。时常会受到空指针异常NPE的骚扰。连Java的发明者都承认这是他的一项巨大失误。那么有什么办法可以避免在代码中写大量的判空语句呢有人说可以使用 JDK8提供的 Optional 来避免判空但是用起来还是有些麻烦。作者在日常工作中封装了一个工具可以可以链式调用对象成员而无需判空相比原有的if null逻辑 和 JDK8提供的 Optional 更加优雅易用在工程实践中大大提高了编码效率也让代码更加的精准和优雅。不优雅的判空调用我想从事Java开发的小伙伴肯定有遇到过下面这种让人难受的判空逻辑现在有一个User类School 是它的成员变量/*** author Axin* since 2020-09-20* summary 一个User类定义* PsData 是lombok组件提供的注解简化了get set等等的约定代码*/Datapublic class User {private String name;private String gender;private School school;Datapublic static class School {private String scName;private String adress;}}
现在想要获得School的成员变量 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());}}
获取adress时要对School进行判空虽然有些麻烦到也能用通过 JDK8 提供的 Optional 工具也是可以但还是有些麻烦。而下文的 OptionalBean 提供一种可以链式不断地调用成员变量而无需判空的方法直接链式调用到你想要获取的目标变量而无需担心空指针的问题。链式调用成员变量如果用了本文设计的工具 OptionalBean 那么上述的调用可以简化成这样public static void main(String[] args) {User axin new User();User.School school new User.School();axin.setName(hello);// 1. 基本调用String value1 OptionalBean.ofNullable(axin).getBean(User::getSchool).getBean(User.School::getAdress).get();System.out.println(value1);}
执行结果其中User的school变量为空可以看到代码并没有空指针而是返回了null。这个工具怎么实现的呢OptionalBean 工具/*** author Axin* since 2020-09-10* summary 链式调用 bean 中 value 的方法*/public final class OptionalBeanT{private static final OptionalBean? EMPTY new OptionalBean();private final T value;private OptionalBean() {this.value null;}/*** 空值会抛出空指针* param value*/private OptionalBean(T value) {this.value Objects.requireNonNull(value);}/*** 包装一个不能为空的 bean* param value* param T* return*/public static T OptionalBeanT of(T value) {return new OptionalBean(value);}/*** 包装一个可能为空的 bean* param value* param T* return*/public static T OptionalBeanT ofNullable(T value) {return value null ? empty() : of(value);}/*** 取出具体的值* param fn* param R* return*/public T get() {return Objects.isNull(value) ? null : value;}/*** 取出一个可能为空的对象* param fn* param R* return*/public R OptionalBeanR getBean(Function? super T, ? extends R fn) {return Objects.isNull(value) ? OptionalBean.empty() : OptionalBean.ofNullable(fn.apply(value));}/*** 如果目标值为空 获取一个默认值* param other* return*/public T orElse(T other) {return value ! null ? value : other;}/*** 如果目标值为空 通过lambda表达式获取一个值* param other* return*/public T orElseGet(Supplier? extends T other) {return value ! null ? value : other.get();}/*** 如果目标值为空 抛出一个异常* param exceptionSupplier* param X* return* throws X*/public X extends Throwable 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);}Overridepublic int hashCode() {return Objects.hashCode(value);}/*** 空值常量* param T* return*/public staticT OptionalBeanT empty() {SuppressWarnings(unchecked)OptionalBeanT none (OptionalBeanT) EMPTY;return none;}}
工具设计主要参考了 Optional 的实现再加上对链式调用的扩展就是上述的OptionalBean。getBean 其实是当变量为空时返回了一个 包装空值的 OptionalBean 对象同时泛型的使用让工具更加易用。使用手册可以看到代码中也提供了和 Optional 一样的扩展方法如 ifPresent()、orElse()等等public static void main(String[] args) {User axin new User();User.School school new User.School();axin.setName(hello);// 1. 基本调用String value1 OptionalBean.ofNullable(axin).getBean(User::getSchool).getBean(User.School::getAdress).get();System.out.println(value1);// 2. 扩展的 isPresent方法 用法与 Optional 一样boolean present OptionalBean.ofNullable(axin).getBean(User::getSchool).getBean(User.School::getAdress).isPresent();System.out.println(present);// 3. 扩展的 ifPresent 方法OptionalBean.ofNullable(axin).getBean(User::getSchool).getBean(User.School::getAdress).ifPresent(adress - System.out.println(String.format(地址存在:%s, adress)));// 4. 扩展的 orElseString value2 OptionalBean.ofNullable(axin).getBean(User::getSchool).getBean(User.School::getAdress).orElse(家里蹲);System.out.println(value2);// 5. 扩展的 orElseThrowtry {String value3 OptionalBean.ofNullable(axin).getBean(User::getSchool).getBean(User.School::getAdress).orElseThrow(() - new RuntimeException(空指针了));} catch (Exception e) {System.out.println(e.getMessage());}}
run一下总结设计了一种可以链式调用对象成员而无需判空的工具让代码更加的精准和优雅如果本文设计的工具满足了刚好解决你的困扰那就在项目中使用吧如果您有更的设计或者文中有错误还请留言一起讨论互相进步
往期推荐这8种常见的SQL错误用法你还在用吗
千万不要这样写代码9种常见的OOM场景演示
用好MySQL的21个好习惯
关注我每天陪你进步一点点
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84578.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!