返回顶部
首页 > 资讯 > 精选 >怎么避免在Java代码中写大量的判空语句
  • 816
分享到

怎么避免在Java代码中写大量的判空语句

2023-06-27 10:06:46 816人浏览 八月长安
摘要

这篇文章主要介绍了怎么避免在Java代码中写大量的判空语句的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么避免在Java代码中写大量的判空语句文章都会有所收获,下面我们一起来看看吧。有人说可以使用 jdk8提

这篇文章主要介绍了怎么避免在Java代码中写大量的判空语句的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么避免在Java代码中写大量的判空语句文章都会有所收获,下面我们一起来看看吧。

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

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

不优雅的判空调用

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

@Datapublic class User {    private String name;    private String gender;    private School school;    @Data    public 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);}

执行结果:

怎么避免在Java代码中写大量的判空语句

其中User的school变量为空,可以看到代码并没有空指针,而是返回了null。这个工具怎么实现的呢?

OptionalBean 工具

public final class OptionalBean<T> {    private static final OptionalBean<?> EMPTY = new OptionalBean<>();    private final T value;    private OptionalBean() {        this.value = null;    }        private OptionalBean(T value) {        this.value = Objects.requireNonNull(value);    }        public static <T> OptionalBean<T> of(T value) {        return new OptionalBean<>(value);    }        public static <T> OptionalBean<T> ofNullable(T value) {        return value == null ? empty() : of(value);    }        public T get() {        return Objects.isNull(value) ? null : value;    }        public <R> OptionalBean<R> getBean(Function<? super T, ? extends R> fn) {        return Objects.isNull(value) ? OptionalBean.empty() : OptionalBean.ofNullable(fn.apply(value));    }        public T orElse(T other) {        return value != null ? value : other;    }        public T orElseGet(Supplier<? extends T> other) {        return value != null ? value : other.get();    }        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);    }    @Override    public int hashCode() {        return Objects.hashCode(value);    }        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. 扩展的 orElse    String value2 = OptionalBean.ofNullable(axin)            .getBean(User::getSchool)            .getBean(User.School::getAdress).orElse("家里蹲");    System.out.println(value2);    // 5. 扩展的 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());    }}

关于“怎么避免在Java代码中写大量的判空语句”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么避免在Java代码中写大量的判空语句”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么避免在Java代码中写大量的判空语句

本文链接: https://lsjlt.com/news/309697.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么避免在Java代码中写大量的判空语句
    这篇文章主要介绍了怎么避免在Java代码中写大量的判空语句的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么避免在Java代码中写大量的判空语句文章都会有所收获,下面我们一起来看看吧。有人说可以使用 JDK8提...
    99+
    2023-06-27
  • Java中避免写嵌套if样式的代码详解
    前言Optional的代码相对更加简洁,当代码量较大时,我们很容易忘记进行null判定,但是使用Optional类则会避免这类问题。下面这是一个嵌套的 if 判断,业务逻辑是从 httpRequst 中获取 X-Auth-Token 的值。...
    99+
    2023-05-31
    java if嵌套 ava
  • java中的if语句怎么写
    if语句有四种使用形式:if(boolean类型表达式){…} if(条件){…}else{…} if(条件){…}else if(条件){…}else{…} if(条件){ if(条件){…} } else {…}一:if(boolean...
    99+
    2015-06-16
    java if 语句
  • css中小写变大写的代码怎么写
    这篇文章将为大家详细讲解有关css中小写变大写的代码怎么写,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 在css中,小写变大写的代码是“te...
    99+
    2024-04-02
  • 在python代码中加入环境变量的语句操作
    以GraphViz为例: 下载安装好的路径名字为C:/Program Files (x86)/Graphviz2.38 import os os.environ["PATH"] ...
    99+
    2024-04-02
  • 怎么避免在Vue中使用null作为class的空值
    本篇内容主要讲解“怎么避免在Vue中使用null作为class的空值”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么避免在Vue中使用null作为class的...
    99+
    2024-04-02
  • c语言判断整数奇偶性的代码怎么写
    判断整数奇偶性的代码可以使用取余运算符(%)来判断。如果一个整数除以2的余数为0,则该整数为偶数;如果余数为1,则该整数为奇数。 以...
    99+
    2023-10-23
    c语言
  • 在Vue中怎么避免在动态绑定类出现空类的情况
    本篇内容介绍了“在Vue中怎么避免在动态绑定类出现空类的情况”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • java判断时间格式是否正确的代码怎么写
    你可以使用 `SimpleDateFormat` 类来判断时间格式是否正确。下面是一个示例代码:```javaimport java...
    99+
    2023-10-12
    java
  • 在MySQL中创建数据库的语句怎么写
    这篇文章主要介绍在MySQL中创建数据库的语句怎么写,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!创建数据库的语句是:【CREATE DATABASE [IF NOT EXISTS]...
    99+
    2024-04-02
  • MyBatis在SQL语句中怎么获取list的大小
    这篇文章主要讲解了“MyBatis在SQL语句中怎么获取list的大小”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MyBatis在SQL语句中怎么获取list的大小”吧!MyBatis在S...
    99+
    2023-07-05
  • Oracle中怎么使用sql语句查看表空间的大小
    这期内容当中小编将会给大家带来有关Oracle中怎么使用sql语句查看表空间的大小,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。  Oracle 查看表空间的大小的方法1...
    99+
    2024-04-02
  • 怎么在windows中批量执行Mysql的sql语句
    这篇文章给大家介绍怎么在windows中批量执行Mysql的sql语句,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。@ECHO OFF SET dbhost=主机名(例如:127.0.0....
    99+
    2023-06-14
  • Java实现经典游戏飞机大战的代码怎么写
    这篇文章主要讲解了“Java实现经典游戏飞机大战的代码怎么写”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java实现经典游戏飞机大战的代码怎么写”吧!主要设计 用Swing库做可视化界面鼠...
    99+
    2023-06-29
  • c语言中if语句是怎么变成汇编代码的详解
    目录 1. 要编译的测试代码: 2. 词法分析3. 语法分析4. 代码生成4.1 gen_expr4.2 cmp_zero4.3 println(" je .L.else.%d", ...
    99+
    2024-04-02
  • python语法中导入import与from时的代码怎么编写
    今天就跟大家聊聊有关python语法中导入import与from时的代码怎么编写,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。import cgi  i...
    99+
    2023-06-17
  • PNG图片在IE6中背景不透明的CSS与JS代码怎么写
    本篇内容主要讲解“PNG图片在IE6中背景不透明的CSS与JS代码怎么写”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PNG图片在IE6中背景不透明的CSS与J...
    99+
    2024-04-02
  • 使用C语言访问51单片机中存储器的核心代码怎么写
    使用C语言访问51单片机中存储器的核心代码怎么写,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛...
    99+
    2023-06-26
  • 想要在Java中使用自然语言处理API,怎样才能更好地打包你的代码?
    随着自然语言处理技术的不断发展,越来越多的Java开发者开始尝试使用自然语言处理API来解决文本处理的问题。但是,在实际开发中,如何更好地打包你的代码成为了一个很重要的问题。本文将会介绍一些关于如何更好地打包自然语言处理API的技巧,并且...
    99+
    2023-07-09
    自然语言处理 api 打包
  • web开发中让DIV一直固定在屏幕的某个位置示例代码该怎么写
    web开发中让DIV一直固定在屏幕的某个位置示例代码该怎么写,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 代...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作