当前位置: 首页 > news >正文

武汉建设银行社会招聘网站互联网推广销售是做什么的

武汉建设银行社会招聘网站,互联网推广销售是做什么的,建设淘宝网站需要多少钱,深圳优化猫△Hollis, 一个对Coding有着独特追求的人△这是Hollis的第 307 篇原创分享作者 l 上帝爱吃苹果来源 l Hollis(ID:hollischuang)对于Java程序员来说,null是令人头痛的东西。时常会受到空指针异常(NPE)的骚扰…

△Hollis, 一个对Coding有着独特追求的人△

这是Hollis的第 307 篇原创分享

作者 l 上帝爱吃苹果

来源 l Hollis(ID:hollischuang)

对于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一下:

总结

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

如果您有更的设计或者文中有错误,还请留言一起讨论,互相进步!

—————END—————喜欢本文的朋友,欢迎关注公众号 程序员小灰,收看更多精彩内容点个[在看],是对小灰最大的支持!
http://www.lbrq.cn/news/2515195.html

相关文章:

  • 成都专业制作网站公司seo的工具有哪些
  • 织梦网站入侵苏州关键词优化搜索排名
  • 做网站提供服务器吗新闻发稿软文推广
  • 怎样创办一个网站搜索引擎营销的四种方式
  • 网站建设项目经验怎么写网络营销案例分析报告
  • 格尔木城乡建设规划局网站西安网站设计开发
  • 台江网站建设推广网站有哪些
  • 免费单页网站建设营销策划咨询机构
  • 济南网站搭建公司手机网站百度关键词排名查询
  • 政府网站建设发展站长工具综合查询ip
  • 南京电商网站建设简述网络推广的方法
  • 怎么做自己网站北京优化靠谱的公司
  • 2023b站免费推广入口游戏百度网站大全
  • 百度网站建设微信封面域名注册 万网
  • 黄岛区做网站的网页设计与网站开发
  • flash素材网站电商代运营收费标准
  • 做网站的问卷调查免费拓客软件
  • 南通网站建设找哪家好建立网站用什么软件
  • 做网站需要神网站怎样优化文章关键词
  • 购物网站的搜索功能是怎么做的网站建设需要啥
  • 温州网上推广什么网站好传统营销
  • 大学网站建设管理制度注册域名查询网站官网
  • 哪些公司做外贸网站江阴企业网站制作
  • 网站建设成本预算百度移动排名优化软件
  • 成都网站推广创新互联江西省seo
  • 昆明做网站建设硬件设备网络营销软文
  • axure可以直接做网站网站媒体推广方案
  • 烘焙类网站开发时代背景百度收录的网页数量
  • 中山营销型网站建设企业营销案例
  • 做视频解析网站播放器和接口安装百度一下
  • 【音视频】WebRTC 开发环境搭建-Web端
  • 4、如何生成分布式ID?
  • django ManyToManyField 如何添加数据
  • Spring AI 1.0 提供简单的 AI 系统和服务
  • JavaScript核心概念全解析
  • vmware虚拟机中显示“网络电缆被拔出“的解决方法