博客
关于我
利用JDK8提供的Optional简化if else
阅读量:570 次
发布时间:2019-03-11

本文共 2103 字,大约阅读时间需要 7 分钟。

如何减少if else(条件判断)代码的冗长性?在软件开发中,条件判断是避免空指针异常的一种常见做法,但繁多的if else会让代码显得臃肿。Java 8提供的Optional类为我们提供了一种更简洁的解决方案。

1. Optional的基本使用

Optional类是一个可以包含或不包含值的容器,并专门用于处理可能 null 的值。其核心方法包括:

  • ofNullable(Object obj):如果obj为null,则返回一个不包含值的Optional;否则返回包含该值的Optional。
  • map(Function Tony):如果Optional包含值,执行Tony函数,返回一个新的Optional;若值为null,则返回一个不包含值的Optional。
  • orElseGet(Supplier supplier):如果Optional包含值,返回其值;若值为null,则运行supplier函数返回一个值。

2. 示例一:时间字符串转换

假设selectStartTime()从数据库中查询LocalDateTime值,则getStartTime()方法原本需要五行代码:

private String getStartTime() {    LocalDateTime dateTime = selectStartTime();    if (dateTime == null) {        return "2020-01-01 00:00:00";    }    return dateTimeToString(dateTime);}
private String getStartTime() {    return Optional.ofNullable(selectStartTime())        .map(dateTime -> dateTimeToString(dateTime))        .orElseGet(() -> "2020-01-01 00:00:00");}

3. 示例二:用户查询优化

原代码:

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

简化代码:

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

4. 示例三:多层条件判断

此前需要多层条件判断:

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 Exception("对象为空");}

简化后:

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

5. 示例四:深入条件判断

简化多层条件判断:

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

简化后:

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

通过使用Optional的链式方法,我们减少了冗长的条件判断,使代码变得简洁明了。这种方式不仅提高了可读性,还更安全地处理了可能的null值情况。

转载地址:http://amnvz.baihongyu.com/

你可能感兴趣的文章
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>
Mysql8在Centos上安装后忘记root密码如何重新设置
查看>>
Mysql8在Windows上离线安装时忘记root密码
查看>>
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
查看>>
mysql8的安装与卸载
查看>>
MySQL8,体验不一样的安装方式!
查看>>
MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
查看>>