【JAVA】优化if else的几种方式

        在代码编写初期,我们写出来的代码,脉络清晰,结构简单。可随着bug或者新需求的出现,状态变得越来越多,只能不停地加else来区分,久而久之,判断的次数越来越多,嵌套的层数也越来越深,变得难以维护。

 下面看看哪些方法能优化if-else呢?

第一种方法:提前return,减少else判断


优化前:

private int handlePre1(boolean flag) {
        if (flag) {
            //do something
        } else {
            //do something
            return -1;
        }
        return 0;
    }


优化后:

private int handleAfter1(boolean flag) {
        if (!flag) {
            //do something
            return -1;
        }
        //do something
        return 0;
    }


这个做法,将可以return的状态提到if中,直接干掉了else!

第二种方法:使用三目运算符


优化前:

private int handlePre2(boolean flag) {
        if (flag) {
            return 0;
        } else {
            return 1;
        }
    }


优化后:

private int handleAfter2(boolean flag) {
        return flag ? 0 : 1;
    }


这种方式局限性比较大,但对于那些依据状态直接返回某个值的情况非常适用,优化后代码非常简洁。如果三目运算符中还嵌套一层三目运算符,建议就不要使用这种方式了。

第三种方法:使用Optional


我们在代码中,经常需要判断某个对象是否为null,不为null后才会进行接下来的操作,好在java8为我们提供了Optional类。

优化前:

User user = new User();
        int age = 20;
        if (user != null) {
            age = user.getAge();
        }

优化后:

User user = new User();
        Optional<User> optionalUser = Optional.ofNullable(user);
        Integer age = optionalUser.map(User::getAge).orElse(20);

Optional让非空校验更加有优雅,代码层面减少了if判断,其实Optional在底层为我们封装好了if null判断而已。

第四种方法:使用switch case


优化前:

private String getCn(String en) {
        String cn;
        if ("student".equals(en)) {
            cn = "学生";
        } else if ("teacher".equals(en)) {
            cn = "教师";
        } else {
            cn = "未知";
        }
        return cn;
    }

同样,我们可以借鉴方式一提前return,来代替else

private String getCnByEarlyReturn(String en) {
        if ("student".equals(en)) {
            return "学生";
        }
        if ("teacher".equals(en)) {
            return "教师";
        }
        return "未知";
    }

如果这里面的情况很多,我们可能依然要判断多次,那我们用switch改写。

优化后:

private String getCnBySwitch(String en) {
        switch (en) {
            case "student":
                return "学生";
            case "teacher":
                return "教师";
            default:
                return "未知";
        }
    }

如果单从效率来看,之前的时间复杂度为O(n),switch的复杂度为O(1),本质上swicth是通过比对String的哈希码来实现的。

第五种方法:使用枚举


如果上一例中的student、teacher是常量的话,最好是定义在枚举里。

public enum CnEnum {

        STUDENT("student", "学生"),
        TEACHER("teacher", "教师"),
        UNKNOWN("unKnown", "未知");

        private String en;
        private String cn;

        public String getEn() {
            return en;
        }

        public String getCn() {
            return cn;
        }

        CnEnum(String en, String cn) {
            this.en = en;
            this.cn = cn;
        }

        static String of(String en) {
            for (CnEnum temp : CnEnum.values()) {
                if (temp.getEn().equals(en)) {
                    return temp.getCn();
                }
            }
            return CnEnum.valueOf("UNKNOWN").getCn();
        }
    }
 

最后这样调用即可:

String cn = CnEnum.of("student");

总结


常见的优化方式,个人觉得有这些,过多的if else严重降低可读性与可维护性,所以在一开始,就要依据实际情况,灵活地选择处理方式。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/522108.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos 系统 yum 无法安装(换国内镜像地下)

centos 系统 yum 因为无法连接到国外的官网而无法安装&#xff0c;问题如下图&#xff1a; 更换阿里镜像&#xff0c;配置文件路径&#xff1a;/etc/yum.repos.d/CentOS-Base.repo&#xff08;如果目录有多余的文件可以移动到子目录&#xff0c;以免造成影响&#xff09; bas…

STM32 | Proteus 8.6安装步骤(图文并茂)

01 Proteus 8.6 简介 Proteus 8.6 是一款功能强大的电子设计自动化软件&#xff0c;广泛用于电路设计、仿真和PCB布局。它为电子工程师和学生提供了一个全面的工具集&#xff0c;用于设计和验证各种电路和电子设备。Proteus 8.6 包括了以下几个主要特性&#xff1a; 1. 电路设…

【lua】lua内存优化记录

这边有一个Unity项目用的tolua&#xff0c; 游戏运行后手机上lua内存占用 基本要到 189M&#xff0c; 之前峰值有200多。 优化点1 加快gc频度&#xff1a; 用uwa抓取的lua内存&#xff0c; 和unity的mono很像&#xff0c;内存会先涨 然后突然gc一下&#xff0c;降下来。 这样…

前端学习之HTML(第一天)

什么是HTML HTML是一种用来描述网页的一种语言&#xff0c;HTML不是一种编程语言&#xff0c;而是一种标记语言。 HTML标签 HTML 标签是由尖括号包围的关键词&#xff0c;比如 <html> HTML 标签通常是成对出现的&#xff0c;比如 <b> 和 </b> 标签对中的…

IEEE独立出版 | 院士出席,投递获取免费参会,与院士交流机会!

第五届信息科学与并行、分布式处理国际学术会议&#xff08;ISPDS 2024&#xff09;2024 5th International Conference on Information Science, Parallel and Distributed Systems2024年5月31-6月2日 | 中国广州 重要信息 大会官网&#xff1a;www.ispds.org 大会时间&…

nodejs web服务器 -- 搭建开发环境

一、配置目录结构 1、使用npm生成package.json&#xff0c;我创建了一个nodejs_network 文件夹&#xff0c;cd到这个文件夹下&#xff0c;执行&#xff1a; npm init -y 其中-y的含义是yes的意思&#xff0c;在init的时候省去了敲回车的步骤&#xff0c;如此就生成了默认的pac…

Axure 单键快捷键 加快绘图速度 提高工作效率

画图类 R&#xff1a;绘制矩形 先点击空白页面&#xff0c;输入R即可绘制 L&#xff1a;绘制直线 先点击空白页面&#xff0c;输入L即可绘制&#xff0c;绘制的时候按住shift直线 O&#xff1a;绘制圆 先点击空白页面&#xff0c;输入O即可绘制&#xff0c;绘制的时候按…

LeetCode-102.题: 二叉树的层序遍历(原创)

【题目描述】 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 【题目链接…

【C语言】InfiniBand驱动mlx4_init和mlx4_cleanup

一、中文注释 Linux内核模块的初始化和清理过程&#xff0c;针对一个称为mlx4的网络设备驱动。以下是代码的逐行中文注释&#xff1a; static int __init mlx4_init(void) {int ret;if (mlx4_verify_params())return -EINVAL; // 检查设备参数是否有效&#xff0c;无效则返回…

抖店月销过万的爆单技巧,新手轻松月入1w+,附抖店学习资料!

我是电商珠珠 抖店开通之后&#xff0c;怎么才能快速出单是很多新手小伙伴困扰的问题。其实想要运营好抖店一点都不难&#xff0c;我做抖店也有三年多时间了&#xff0c;接下来我说的每一步&#xff0c;不管是有货源还是无货源的都适用。 1、铺货低价福利款 店铺开好之后&am…

Java Web开发---复试Tips复习

***********&#xff08;自用&#xff0c;摘录自各种文章和自己总结&#xff09;********** 小知识点理解 Web Web应用开发主要是基于浏览器的应用程序开发。一个Web应用由多部分组成 java web就是用java语言开发出可在万维网上浏览的程序 Web应用程序编写完后&#xff0c;…

如何在Windows上使用Docker,搭建一款实用的个人IT工具箱It- Tools

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…