点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

本文来自作者投稿,原作者:上帝爱吃苹果

对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰。连Java的发明者都承认这是他的一项巨大失误。

那么,有什么办法可以避免在代码中写大量的判空语句呢?

有人说可以使用 JDK8提供的 Optional 来避免判空,但是用起来还是有些麻烦。

作者在日常工作中,封装了一个工具,可以可以链式调用对象成员而无需判空,相比原有的if null逻辑 和 JDK8提供的 Optional 更加优雅易用,在工程实践中大大提高了编码效率,也让代码更加的精准和优雅。

不优雅的判空调用

我想从事Java开发的小伙伴肯定有遇到过下面这种让人难受的判空逻辑:现在有一个User类,School 是它的成员变量

/*** @author Axin* @since 2020-09-20* @summary 一个User类定义* (Ps:Data 是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 OptionalBean<T> {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> OptionalBean<T> of(T value) {return new OptionalBean<>(value);}/*** 包装一个可能为空的 bean* @param value* @param <T>* @return*/public static <T> OptionalBean<T> 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> OptionalBean<R> 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 static<T> OptionalBean<T> empty() {@SuppressWarnings("unchecked")OptionalBean<T> none = (OptionalBean<T>) 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一下:

总结

设计了一种可以链式调用对象成员而无需判空的工具让代码更加的精准和优雅,如果本文设计的工具满足了刚好解决你的困扰,那就在项目中使用吧!

工具推荐

大家可能不知道,囤茅台已经成为了一门生意!在很早之前,网上甚至还流传着这么一句话:买茅台股票还不如买上一车茅台酒屯着,这个玩意比金子还涨价快!

53 度飞天茅台官方指导出手价是 1499 元,但是正常情况下,1499 根本买不到,线下的专卖店可以买到 2000-3000 元左右,而且还容易买到假货!

相信很多人都知道,现在京东、苏宁、淘宝等各大网站都推出了茅台秒杀活动,以活动价格 1499 的价格进行抢购。

抢到就是赚到,二手市场茅台价格最低 2000 起,甚至会飙到 3000 左右,转手最少赚 500 元。

尤其是最近临近过年,茅台更成了畅销品。所以,很多人蹲守在各大网站,第一时间进行线上抢购。

现在抢购茅台,甚至已经成为了一个产业链,有人专门教大家怎么利用工具抢购茅台,抢购成功,一次收费 500 元!

开源抢茅台工具

已经有一位大神开发了一个抢购脚本,免费进行了开源,很多人都是使用这个脚本抢到了茅台。

看了一下它的实现思路,主要是这两种:

  • 一种是利用 py 脚本模拟浏览器请求,来实现抢茅台。

  • 另一种是通过 Chrome 插件来模拟用户点击行为,来实现抢茅台行为。

原作者分享的开源项目超过了 70K Star,但某种不知道的原因已经删除了。

由于备份的比较早,网上还存在着 2 份开源代码,对这份开源项目感兴趣的朋友,可以在下方公众号内回复:茅台

开源项目获取方式

关注下方公众号

????????????

回复关键字「茅台」,即可下载

求求你,不要再使用!=null判空了!相关推荐

  1. 求求你不要在用!=null判空了

    作者:诗意凌风 | http://suo.im/5t3akh 导语 在没有用Optional判空之前,你是否也像下面的代码一样判空呢?如果是,请往下看,Optional 相对传统判空的优势. java ...

  2. java判空null前后,关于java:引不要再使用null判空了

    以下文章来源于Hollis ,作者上帝爱吃苹果 对于Java程序员来说,null是令人头痛的货色.时常会受到空指针异样(NPE)的骚扰.连Java的发明者都抵赖这是他的一项微小失误. 那么,有什么方法 ...

  3. 你只会用 ! = null 判空?嘿嘿!

    今日推荐 扔掉 Postman,一个工具全部搞定,真香!为啥查询那么慢?还在直接用JWT做鉴权?JJWT真香推荐 15 款常用开发工具干掉 navicat:这款 DB 管理工具才是y(永)y(远)d( ...

  4. 为什么我不建议你用去 “ ! = null 做判空?

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:腾讯推出高性能 RPC 开发框架 个人原创100W+访问量博客:点击前往,查看更多 转自:CSDN  作者:li ...

  5. Java:List判空的条件:List=null 和 List.size = 0 当需要对一个LIst进行判空操作时我们可使用如下两个语句:

    当需要对一个LIst进行判空操作时我们可使用如下两个语句: if (list == null || list.size() == 0) {} if (list != null && l ...

  6. Stackoverflow 高赞答案,为什么牛逼的程序员都不用 “ ! = null ' 做判空

    欢迎关注方志朋的博客,回复"666"获面试宝典 为了避免空指针调用,我们经常会看到这样的语句. ... if (someobject != null) {someobject.do ...

  7. 拜托!不要用“ ! = null 做判空了

    点击关注公众号,Java干货及时送达 为了避免空指针调用,我们经常会看到这样的语句 ...if (someobject != null) {someobject.doCalc();}... 最终,项目 ...

  8. Stackoverflow 高赞答案,为什么牛逼的程序员都不用 “ ! = null ' 做判空?

    来源:blog.csdn.net/lizeyang/article/details/40040817 为了避免空指针调用,我们经常会看到这样的语句. ... if (someobject != nul ...

  9. 为什么牛逼的程序员都不用 “ ! = null 做判空?

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客: ...

最新文章

  1. FindAllAnagramsinaString
  2. python3 局域网udp广播
  3. Boost:无序的bimap双图的测试程序
  4. kafka集群安全化之启用kerberos与acl
  5. 解决VS2017引用报错问题
  6. 免杀需要的基本汇编知识
  7. 在secureCRT上设置常用的快捷输出按钮栏
  8. txt替换回车键符号怎么打_电脑小于等于符号≤怎么打
  9. Python帮助文档
  10. idea导入opencv教程
  11. Excel如何删除表格中的空白列
  12. Stata绘制分类带可信区间的折线图
  13. 鹅长微服务发现与治理巨作PolarisMesh实践-上
  14. QT编写USB PRINTER驱动
  15. day20.1-CE基本使用与原理
  16. VS C++ error LNK2005 1169报错
  17. 蓝桥杯算法训练VIP-旅行家的预算
  18. 查看linux ftp字符集,linux 字符集及FTP传输乱码处理
  19. Android工具类获取上下文对象
  20. Labview 和TortoiseSVN 版本控制

热门文章

  1. JAVA 第五周学习总结
  2. HTTP请求时connectionRequestTimeout 、connectionTimeout、socketTimeout三个超时时间的含义...
  3. html的body内标签之input系列1
  4. 判断JS对象是否拥有某属性两种方式
  5. VIM7.3添加中文帮助文档
  6. struct发送与显示中文
  7. Task04:青少年软件编程(Scratch)等级考试模拟卷(二级)
  8. 【青少年编程】【一级】 奔跑的马
  9. 【ACM】杭电OJ 2024
  10. 【MATLAB】交互式绘图(ginput,gtext,zoom)