利用JDK8提供的Optional简化if else

Java 8 Optional在实际业务场景中的运用 如果Optional仅支持非空校验,那么使用场景其实有限的,索性Optional还支持非空校验外的其它校验来过滤数据。因此本文将不会对Optional的各个方法进行详细的阐述,只会说明Optional在实际场景中如何使用,并提及一些Optional方法的注意事项。 本文描述了Optional在实际业务场景中的用法,并且涉及到了Optional的各个方法:ofNullable、filter、ifPresent、map、orElse、orElseGet等。 阅读详情

程序猿日常开发中,为了避免NullPointerException异常,会写很多if else的判断。如果if else太多会让代码显的很乱,那如何减少if else的使用呢?


减少if else的方式之一,利用JDK8提供的Optional


ofNullable()、map()、orElseGet()的使用示例

示例中getStartTime()获取String类型的时间字符串并返回。执行逻辑:

  1. 调动selectStartTime()查询DB返回LocalDateTime值;
  2. 响应值dateTime如果为null,就给一个默认值;
  3. 响应值dateTime如果不为null,就把dateTime值转换成String类型的时间字符串并返回。

getStartTime()方法体用了5行代码。

private String getStartTime() {
    LocalDateTime dateTime = selectStartTime();
    if (dateTime == null) {
        return "2020-01-01 00:00:00";
    }
    return dateTimeToString(dateTime);
}

private LocalDateTime selectStartTime(){
   //去DB查找业务需要的LocalDateTime值
}

protected String dateTimeToString(LocalDateTime dateTime) {
    if (dateTime == null) {
        return null;
    }
    return DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT).format(dateTime);
}

接着我们利用JDK8提供的Optional类,把以上5行代码简化成下面的1行代码。

private String getStartTime() {
    return Optional.ofNullable(selectStartTime()).map(e->dateTimeToString(e)).orElseGet(()->"2020-01-01 00:00:00");
}

1行代码达到同样的效果。


ofNullable()、orElseGet()的使用示例

如果上面没看懂,那看一下这个简化版的示例:

User user = getCacheUser(1);
if (user == null) {
    user = selectUserById(1);
}

static class User {
     private String name;
     private Address address;

     //Get、Set方法
 }

 static class Address {
     private String area;
     private String province;
     private String city;

     //Get、Set方法
 }

接着我们利用JDK8提供的Optional类,把以上4行代码简化成下面的1行代码。

User user = Optional.ofNullable(getCacheUser(1)).orElseGet(() -> selectUserById(1));

注意:Optional的orElseGet()的参数是一个函数式接口,只有在条件为null时才会执行orElseGet()里的方法,这是跟orElse()最大的区别,用orElseGet()性能会更好。


ofNullable()、map()、orElseGet()的使用示例

public String getCity(User user)  throws Exception{
   if(user!=null){
       if(user.getAddress()!=null){
           Address address = user.getAddress();
           if(address.getCity()!=null){
               return address.getCity();
           }
       }
   }
   throw new Excpetion("对象为空"); 
}

接着我们利用JDK8提供的Optional类,把以上多层if为空的判断简化成下面的1行代码。

public String getCity(User user) throws Exception{
    return Optional.ofNullable(user)
                   .map(u-> u.getAddress())
                   .map(a->a.getCity())
                   .orElseThrow(()->new Exception("对象为空"));
}

ofNullable()、ifPresent()的使用示例

if(user!=null){
    dosomething(user);
}

接着我们利用JDK8提供的Optional类,把以上3行代码简化成下面的1行代码。

 Optional.ofNullable(user).ifPresent(u->dosomething(u));

ofNullable()、map()、orElseGet()的使用示例

public User getUser(User user) throws Exception{
    if(user!=null){
        String name = user.getName();
        if("zhangsan".equals(name)){
            return user;
        }
    }else{
        user = new User();
        user.setName("zhangsan");
        return user;
    }
}

接着我们利用JDK8提供的Optional类,把以上多层if为空的判断简化成下面的1行代码。

public User getUser(User user) {
    return Optional.ofNullable(user)
                   .filter(u->"zhangsan".equals(u.getName()))
                   .orElseGet(()-> {
                        return new User("zhangsan");
                   });
}

【数学建模】 进化计算与群体智能 遗传算法(GA)是一种用于优化和搜索问题的启发式算法。它模拟了自然选择的过程,其中个体通过遗传和变异进行繁殖,逐渐进化出更优的解。基本步骤初始化:生成初始种群。适应度评估:评估种群中每个个体的适应度。选择:根据适应度选择个体进行繁殖。交叉:选定个体对进行基因交换,生成新的后代。变异:对一些个体进行基因变异,以增加多样性。迭代:重复评估和繁殖过程,直至达到停止条件。粒子群优化算法(PSO)是一种基于群体智能的优化算法,由Kennedy和Eberhart于1995年提出。其灵感来源于鸟群觅食的行为。 阅读详情

相关推荐

vue高德地图POI关键字搜索定位

最近在项目中遇到了关于地图的问题,首先为了满足需求从而使用的是JSAPI为2.0版本的。需求是根据关键字搜索定位到该位置。值得注意的是在使用 AMap.Event.addListener时 Event一定要大写的E,不然页面会报错。在地图上定义一个输入框,根据输入的位置进行提示,然后点击后跳转到对应的位置并打点标记。JSAPI主要使用这两个。

YL 2136

利用Optional避免多次if else判断

1:避免 if else 判断利用策略模式: https://blog.csdn.net/weixin_41987908/article/details/100898555 2:利用Optional避免多次if else判断: 对象层层嵌套,为了逻辑严谨必须要进行空判断,如果不层层判断,有可能在某一层上收获一个空指针,而Optional优雅的帮我们处理掉这样的逻辑。 优化前: School ...

weixin_41987908的博客 6527

尚硅谷Redis 7学习笔记

尚硅谷Redis 7学习笔记

不更了,主打一个陪伴 2万+

Optional的详细实战用法,优雅的消除if..else..复杂逻辑运算函数封装....

如何优雅的消除if…else…让代码看起来高大上?兄弟们搞起来啊 如果你要问我,你天天都在干嘛,我会斩钉截铁的告诉你,不是在写if的路上,就是在准备写else;天下之大,万物皆对象,唯独你单身…,但是,上帝创造了 if…else,让程序猿们有了新的希望; if(我是高富帅){ System.out("对象排排站") }else{ System.out("苦逼的写代码") } 不叨逼叨逼叨了.先给大家看段代码,你若不晕,我连吹两瓶二锅头… public class DiscountedPric

R࿆ebirth༢ -青楼 4987

别再手动建模了!用Simscape Multibody Link一键导入SolidWorks装配体到Simulink

本文介绍了如何利用Simscape Multibody Link插件将SolidWorks装配体一键导入Simulink,实现CAD到仿真的无缝衔接。该技术显著提升机械系统设计与控制效率,特别适用于工业机器人、车辆悬架等复杂机构的动力学分析。文章详细解析了插件安装、模型导出优化及仿真验证的全流程,帮助工程师摆脱手动建模的低效工作模式。

weixin_27256197的博客 458

联想Win10改Win7设置BIOS指南

通过本文的指南,你应该能够成功地在联想Win10电脑上设置BIOS以支持Windows 7的安装和运行。尽管Windows 10提供了许多现代化的功能和改进,但如果你因特定需求而更倾向于使用Windows 7,那么本文提供的步骤将帮助你顺利实现这一转换。请记住,在更改操作系统前务必做好充分的准备工作,并在安装过程中保持耐心和细心。祝你安装顺利!

mmoo_python的博客 2039

jdk8-if-else新特性

先介绍一下API,与其他文章不同的是,本文采取类比的方式来讲,同时结合源码。而不像其他文章一样,一个个API罗列出来,让人找不到重点。

weixin_56338804的博客 456

HAMi 核心模块与架构设计

HAMi 的架构设计是围绕 Kubernetes 生态系统构建的,通过扩展 Kubernetes 的调度能力和设备管理能力,为用户提供了高效、灵活的异构设备虚拟化和管理解决方案。

北斗云的博客 2552

Optional简化空值判断,减少代码中的if-else代码块

为了防止空指针异常的出现,Java8中引入了一个新类Optional,对于它之前我们已经进行了简单的实现。其本质就是通过Optional类对值进行封装, 当有值的时候,会把该值封装到Optional类中。如果没有值的话,则会在该类封装一个Empty 创建Optional对象 //empty()会直接返回一个空的Optional实例,内部不会存在任何值。 Optional<Student> studentOptional = Optional.empty(); //of()会返回一个存在值的Op

weixin_44045520的博客 2128

告别偏移地址!用C# S7PLUS驱动读写西门子S7-1500符号地址(TIA Portal V17+环境配置)

本文详细介绍了如何在TIA Portal V17+环境中使用C# S7PLUS驱动读写西门子S7-1500 PLC的符号地址,告别传统的偏移地址方式。通过配置OpenSSL、集成S7PLUS驱动库,以及实战案例展示符号地址的读写方法,显著提升代码可读性和维护效率。文章还涵盖了环境准备、高级配置及常见问题解决方案,助力工业自动化开发者实现更高效的PLC通讯。

weixin_28720767的博客 315

从C-EPS到DP-EPS:手把手图解不同EPS类型怎么选,对你的车操控感影响有多大?

方向盘转动时那股细腻的阻尼感,高速过弯时令人安心的沉稳,或是狭窄车位里一根手指就能拨动的轻盈——这些看似微妙的差异,其实都源自转向系统电机那几厘米的安装位置变化。当我们谈论驾驶乐趣时,发动机参数和悬架调校总是占据C位,但真正连接驾驶者与车辆的神经末梢,恰恰是那套默默工作的电动助力转向系统(EPS)。不同EPS类型带来的操控特性差异,可能比马力数字更能定义一辆车的性格。

weixin_30920513的博客 531

JDK8简化if-else

简化if-else 1234567891011 User user = ...if (user != null) { String userName = user.getUserName(); if (userName != null) { return userName.toUpperCase(); } else { re...

weixin_30372371的博客 2046

嵌入式开发中SAR与ΔΣ ADC选型指南:从原理到实战应用

模数转换器是嵌入式系统连接模拟世界与数字世界的核心接口,其选型直接决定了数据采集的精度与可靠性。SAR ADC采用逐次逼近原理,如同天平称重,通过二进制搜索快速完成转换,具备高速、多通道轮询的优势,适合电机控制、通信等动态场景。ΔΣ ADC则基于过采样与噪声整形技术,以速度换取精度,通过数字滤波输出高分辨率结果,在传感器测量、音频采集等静态高精度领域表现卓越。理解这两种架构的工作原理差异,是进行嵌入式ADC选型的基础。在实际工程中,需结合信号带宽、多通道切换需求、功耗约束及PCB布局能力进行综合权衡。例如,

weixin_30140399的博客 244

java中多个if语句如何简化_8种if else语句简化方法

if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else语句会让我们感到代码过于冗杂,这时候我们就需要采取一些方法来简化多余的if else语句。下面就分享给大家8种if else语句简化方法。1.使用 return我们使用 return 去掉多余的 else,实现代码如下。优化前代码:if (str.equals("java")) {// 业务代码 ! true;...

weixin_39886251的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

if else语句的简化

1.简化: 2.使用 return 我们使用 return 去掉多余的 else,实现代码如下。 优化前代码: if (str.equals("java")) { // 业务代码 ! true; } else { return ; } 优化后代码: if (str.equals("java")) { return ; } return false; 这样看起来就会舒服很多,虽然相差只有一行代码,但真正的高手和普通人之间的差距就是从这一行行代码中体现出来的。.

sinat_38710226的博客 1112

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

使用JDK1.8 特性 Optional,优雅解决NullPointException

前言 Optional是属于JDK1.8API新增的,可以优雅解决空指针异常的问题。也可以去除掉重复的if else逻辑问题。 对着旧的代码,修改为使用Optoinal逻辑,有些例子参考网址的,这个只是我作为笔记。 Optional主要方法: 常用方法:ofNullable,of,map,orElse,ofElseThrow。其他自己参考使用,不得不说jdk1.8的api挺好用的。 ...

蜀山小师叔 1308

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

优化if else

优化 if else 参考:《阿里巴巴java编码规范》、《设计模式》(清华大学出版)、https://blog.csdn.net/mifffy_java/article/details/95201289 1、 阿里编程归约 对于控制语句,阿里归约上推荐了一种思路。【推荐】在表达异常的分支时,尽量少用 if else 方式,这种方式可以改写成: if(condition){ ... ...

FBB360JAVA的博客 2841

if else 太多?看我用 Java 8 轻松干掉!

之前我用 Java 8 写了一段逻辑,就是类似下面这样的例子: /* * 来源公众号:Java技术栈 */ if(xxxOrder != null){ if(xxxOrder.getXxxShippingInfo() != null){ if(xxxOrder.getXxxShippingInfo().getXxxShipmentDetails() != null){ if(xxxOrder.getXxxShippingInfo().getXxxShipme

Java技术栈,分享最主流的Java技术 1161

java if-else 优化,代码美如画

在代码中大量使用if-else判断在某些情况下可能会导致代码的可读性和维护性变差,尤其是当有很多不同的条件需要处理时。可读性差:大量的 if-else 语句会使代码变得臃肿,难以理解和阅读。可维护性差:随着条件的增多,添加或修改条件变得困难。每次更改可能需要检查所有的 if-else 语句,以确保没有遗漏或错误。性能问题:虽然性能差异通常很小,但大量的 if-else 语句在某些情况下可能会导致性能问题,特别是当条件判断非常复杂时。

我哎GIS博客 1694

JDK8新特性之Optional快速入门

Java8中Optional的empty(), of(T value), ofNullable(T value), orElse(), orElseGet(), orElseThrow(), map(), flatMap(), isPresent(), ifPresent(), filter()用法

WLQ0621的博客 1183

使用Map和Optional类优化if-else

的东西,这是Google Guava里的一个类,可生成一个不可变的Map对象,这就意味着,初始化定义后,后续就无法再put修改了,它的这个特性可以保证线程的安全。一般用来替换if-else的map,我们就是要求在初始化定义后,就不会再允许修改了,因此,这个ImmutableMap生成的map,可以很好地帮我们实现这一点。另外,最重要一点是,使用这个ImmutableMap,可以实现链式编程,就像上面定义的链式写法,若是用传统的map定义,就每次都要map.put()、map.put()地赋值。

俗世庸人 866

如何优化代码中大量的if/else

文章目录1. 提前return2. 策略模式2.1 多态2.2 枚举3. 学会使用 Optional4. 数组小技巧结束 一个快速迭代的项目,时间久了之后,代码中可能会充斥着大量的if/else,嵌套6、7层,一个函数几百行,简!直!看!死!人! 其实这种还算好的,更严重的嵌套我也见过,接手到这种项目的人,内心应该是绝望的。 出现这种情况的原因很多 设计不够完善 需求考虑不完全 开发人员变动...

Apple_Boy的博客 2878

优化If else(简化代码)

if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到头晕。 当我们回过头看代码或者欣赏他人代码时,感到烦人。我总结了几种方式,可以参考呀。 1.使用 return 我们使用 return 去掉多余的 else,实现代码如下。 优化前代码: if ("java".equals(str)) { // 业务代码...... } else { return; } 优化后代码: if (!"java".equals(str)) { retu

qq_40742949的博客 2483

if-else优化实践总结

一般用来替换if-else的map,我们就是要求在初始化定义后,就不会再允许修改了,因此,这个ImmutableMap生成的map,可以很好地帮我们实现这一点。另外,

761

JKD8 Optional类,JAVA 代码整洁的语法糖

简化了一下业务代码。ofNullable( )构造一个Optional对象,容器中的对象是map里的value,该方法value为空时不会报错。Optional源码中可以看到ifPresent( ),需要的参数是一个Consumer类,类上加了@FunctionalInterface表名该类是一个函数式接口(只有一个抽象方法的接口)。accept( )方法可以理解为一个消费者,是有入参但是没有返回的,因此在ifPresent( )方法里使用的方法或者逻辑是不能有返回值的,否则会有检查型异常。

qq_25720801的博客 279

减少if else的几种小技巧

1.使用return 2.使用switch 3.使用三目运算 4.使用枚举 5.使用多态 6.使用jdk1.9新特性 1.使用return(常用) 优化前代码: if ("java".equals(str)) { // 业务代码...... } else { return; } 优化后代码: if (!"java".equals(str)) { return; } 2.使用三目运算(...

qq_34024778的博客 2121
上一篇: Java Map的最高校遍历方法
下一篇: mybatis-plus修改日志只打印SQL语句不打印查询结果
pbxs
博客等级 码龄14年 94粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值