Java8之后的业务取值避免空指针的一种解法

简介: Java8之后的业务取值避免空指针的一种解法

写业务代码的时候,通常会遇到数据库POJO对象转换为前端需要的VO对象,这时经常会遇到烦人的空指针问题,Java 8之前,我们可能这么写:

  1. 对于对象field复制风格:
a.setCreateTime(b.getCreateTime().getTime());
a.setAmount(b.getPayed()+b.getVoucher());


  1. 对于装饰器风格:
public Long getCreateTime() {
    return b.getCreateTime().getTime();
}
public Long getAmount() {
    return b.getPayed()+b.getVoucher()
}


很明显,这些代码会有空指针异常的风险.一般我们会这么修改:

  1. 对于对象field复制风格:
if (b.getCreateTime()!= null) {
    a.setCreateTime(b.getCreateTime().getTime());
}
if (b.getPayed() != null) {
    a.setAmount(b.getPayed();     
} else {
    a.setAmount(0L);
}
if (b.getVoucher() != null) {
a.setAmount(a.getAmount()+b.getVoucher());
}


  1. 对于装饰器风格:
public Long getCreateTime() {
    if (b.getCreateTime()!= null) {
        return b.getCreateTime().getTime();
    } else {
        return null;
    }
}
public Long getAmount() {
    Long result = 0L;
    if (b.getPayed() != null) {
        result += b.getPayed();
    }
    if (b.getVoucher() != null) {
        result += b.getVoucher();
    }
    return result;
}


Java8引入的Optional写法:

  1. 对于对象field复制风格:
Optional.ofNullable(b.getCreateTime()).ifPresent(timestamp -> a.setCreateTime(timestamp.getTime()));
a.setAmount(Optional.ofNullable(b.getPayed()).orElse(0L) + Optional.ofNullable(b.getVoucher()).orElse(0L));
  1. 对于装饰器风格:
public Long getCreateTime() {
    Optional<Timestamp> createTime = Optional.ofNullable(b.getCreateTime());
    if (createTime.isPresent()) {
        return createTime.get();
    } else {
        return null;
    }
}
public Long getAmount() {
    return Optional.ofNullable(b.getPayed()).orElse(0L) + Optional.ofNullable(b.getVoucher()).orElse(0L)
}


这样依然很复杂,尤其是嵌套多层之后。 更进一步,有没有通用简便的方法呢?联想到Java8的Functional Interface以及我们需要处理的异常只有空指针异常,可以写工具类:


import java.util.function.Supplier;
public class OptionalUtil {
    /**
     * 忽略NullPointerException的获取
     * @param supplier
     * @param <T>
     * @return 如果有空指针,返回null
     */
    public static <T> T orNull(Supplier<T> supplier) {
        try {
            return supplier.get();
        } catch (NullPointerException e) {
            return null;
        }
    }
    /**
     * 忽略NullPointerException的获取
     *
     * @param supplier
     * @param or
     * @param <T>
     * @return 如果有空指针,返回or
     */
    public static <T> T or(Supplier<T> supplier, T or) {
        try {
            T t = supplier.get();
            if (t != null) {
                return t;
            }
            return or;
        } catch (NullPointerException e) {
            return or;
        }
    }
}


这样,我们的代码就变得简洁多了:

  1. 对于对象field复制风格:
a.setCreateTime(OptionalUtil.orNull(() -> b.getCreateTime().getTime()));
a.setAmount(OptionalUtil.or(() -> b.getPayed(), 0L) + OptionalUtil.or(() -> b.getAmount(), 0L));


  1. 对于装饰器风格:
public Long getCreateTime() {
    return OptionalUtil.orNull(() -> b.getCreateTime().getTime());
}
public Long getAmount() {
    return OptionalUtil.or(() -> b.getPayed(), 0L) + OptionalUtil.or(() -> b.getAmount(), 0L);
}
相关文章
|
2月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
39 6
|
2月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
41 1
|
2月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
40 1
|
2月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
45 0
|
2月前
|
存储 算法 Java
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
23 0
java.lang.NullPointerExceptionMybatisPlus出现,测试,java.lang.NullPointe,空指针异常,public方法少写了一个字段,没加注解
java.lang.NullPointerExceptionMybatisPlus出现,测试,java.lang.NullPointe,空指针异常,public方法少写了一个字段,没加注解
|
3月前
|
缓存 Java 数据库连接
Java演进问题之指针的间接获取现在对性能的影响变得更大如何解决
Java演进问题之指针的间接获取现在对性能的影响变得更大如何解决
|
4月前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
37 3
|
4月前
|
Java
杭电 OJ 1010-1019 Java解法(未更新完毕)
杭电 OJ 1010-1019 Java解法(未更新完毕)
22 1
|
5月前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
83 1
探索Java开发中触发空指针异常的场景
下一篇
无影云桌面