利用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");
                   });
}

【NLP】语言模型的发展历程 (1) N-gram模型是一种基于统计语言模型的文本分析算法,它用于预测文本中下一个词出现的概率,基于前面出现的n-1个词的序列。这里的n代表序列中元素的数量,因此称为N-gram。Unigram:N=1,每个单词的出现概率独立计算,不考虑上下文。Bigram:N=2,基于前一个单词预测当前单词的联合概率模型。Trigram:N=3,考虑前两个单词来预测当前单词的联合概率模型,更复杂但可能更准确。 阅读详情

相关推荐

Android13多路录音实战:如何用AudioRecord实现6通道音频采集(附完整代码)

本文详细解析了在Android13中使用AudioRecord API实现6通道音频采集的全流程,包括硬件兼容性检测、多通道配置、数据处理与性能优化。通过实战代码示例,帮助开发者掌握多路录音技术,适用于空间音频、环绕声录制等专业场景。

weixin_26965807的博客 478

利用Optional避免多次if else判断

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

weixin_41987908的博客 6527

机器人路径规划:基于冠豪猪优化算法(Crested Porcupine Optimizer,CPO)的机器人路径规划(提供MATLAB代码)

移动机器人(Mobile robot,MR)的路径规划是 移动机器人研究的重要分支之,是对其进行控制的基础。根据环境信息的已知程度不同,路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或局部已知的局部路径规划。随着科技的快速发展以及机器人的大量应用,人们对机器人的要求也越来越高,尤其表现在对机器人的智能化方面的要求,而机器人自主路径规划是实现机器人智能化的重要步骤,路径规划是指规划机器人从起点位置出发,无碰撞、安全到达指定目标位置的最优路径。

IT猿手 1367

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

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

R࿆ebirth༢ -青楼 4987

【清华大学软院】15-19年推免试题历年整理

整理的题目为清软预推免机试(外校)硕士机考题目。 年代 题目1 题目2 题目3 2019 质因数分解 二叉搜索树 区间DP(折叠字符串) 2018 日期转换 高精度模拟 区间DP(戳气球) 2017 进制素数 被遗漏的数字 DP(收集苹果) 2016 大数运算 DP DFS 2015 进制素数: http://acm.hdu.edu.cn/showproblem.php?pid=1230 2017年题目(这个是找的最准确的题目): 1题见【链接】 2题见【链接】

云端筑梦师 2255

Ferromagnetic soft continuum robots

本文来自机器人领域顶刊,Science Robotics。介绍了一种铁磁软连续体机器人,主要贡献为1)介绍了一个基于磁性微粒和聚合物的软连续体机器人的制造方法,在机器人外表面涂了一层水凝胶,极大地降低了摩擦阻力;2)并研究了在磁场下,不同粒子体积分数下,此机器人的驱动性能;利用手动操控的磁铁,进行了许多实验证明该机器人性能的优异性。 铁磁软连续体机器人 Ferromagnetic soft continuum robots [1] Paper Link Authors: Kim, Yoonho, et al

XU Yangxin的博客 1372

jdk8-if-else新特性

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

weixin_56338804的博客 456

HFSS线圈仿真避坑指南:从建模到寄生参数分析的完整流程

本文详细介绍了HFSS线圈仿真的完整流程,从精准建模到寄生参数优化,特别针对Ansys Electronics Desktop用户提供实用指南。涵盖线圈几何构建、材料属性配置、端口激励设置及寄生电阻与电感分析等关键步骤,帮助工程师避免常见错误,提升仿真精度与效率。

weixin_29209801的博客 549

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

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

weixin_44045520的博客 2128

SqlSugar避坑指南:C#操作MySQL时你可能会忽略的5个细节

本文分享了使用C#和SqlSugar框架操作MySQL数据库时的实战避坑指南。针对连接配置、实体映射、查询性能、事务处理等关键环节,深入剖析了5个容易被忽略但至关重要的细节,帮助开发者提升项目稳定性和执行效率,避免常见陷阱。

delta的博客 276

数字后端设计实现 | 数字后端PR工具Innovus中如何创建不同高度的row?

数字IC后端设计实现之innovus中如何创建不同高度的row?

weixin_37584728的博客 3163

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

基于STM32、HAL库的RN8209D电能计量芯片驱动程序设计

/ 假设电压互感器变比为220V:0.5V,电流互感器变比为20A:5mA。// 电压ADC原始值。// 电流ADC原始值。// 有功功率(W)// 电能(kWh)

corlin6688的博客 470

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万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

if else语句的简化

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

sinat_38710226的博客 1112

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

蜀山小师叔 1308

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

优化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、付费专栏及课程。

余额充值