Java解决if(!=null)臭名昭著的判空处理(Optional)

原文链接:Java解决if(!=null)臭名昭著的判空处理(Optional)
😝😏


话不多说,我们先来看一下下面这个代码:

/**
 * 场景一:
 * 获得实体对象的某个值
 */
private String getDemoEntityDeName1(DemoEntity demoEntity) {
    if (demoEntity != null) {
        DemoEntitySon demoEntitySon = demoEntity.getDemoEntitySon();
        if (demoEntitySon != null) {
            String strName = demoEntitySon.getDeName();
            if (strName != null) {
                return strName;
            }
        }
    }
    return null;
}

我们可以看见,为了获得,一个name,必须要进行多次空判断,否则,就存在空异常!!!

那么如何改进呢?

jdk1.8提出了Optional方法用来解决此方法:

依然是上述代码,改如何改进?

//改进写法
private String getDemoEntityDeName2(DemoEntity demoEntity) {
    return Optional.ofNullable(demoEntity)
            .map(DemoEntity::getDemoEntitySon)
            .map(DemoEntitySon::getDeName).orElse(null);
}

接着看场景二:

/**
 * 场景二:
 * 判断对象或者字符是否为空,为空返回false,非空true
 */
private boolean getBoType1() {
    String type = null;
    if (type == null) {
        return false;
    } else {
        return true;
    }
}

我们为了获得判断是否为null,进行这样写?一点也不美观,如果代码多了,可读性极差。。。

//改进写法
private boolean getBoType2() {
    String type = null;
    return Optional.ofNullable(type).isPresent();
    /**
     * 源码:
     * public boolean isPresent() {
     *         return value != null;
     *     }
     */
}

现在代码看起来比之前采用条件分支的冗长代码简洁多了。


以下扒一下,两个方法的源码,看起来也不难。

 //of方法源码
    private void testOf() {
        //这里一定会抛出异常
        DemoEntity demoEntity = null;
        Optional.of(demoEntity);
        /** 源码:为null直接抛空指针异常
         * public static <T> T requireNonNull(T obj) {
         *         if (obj == null)
         *             throw new NullPointerException();
         *         return obj;
         *     }
         */
    }

    //OfNullable源码
    private void testOfNullable() {
        DemoEntity demoEntity = null;
        Optional.ofNullable(demoEntity).orElse(null);
        /**   源码:直接判空和of判断
         *    public static <T> Optional<T> ofNullable(T value) {
         *         return value == null ? empty() : of(value);
         *     }
         */
    }

用法如上,原理用法请直接扒源码,很简单看懂。

Java中,断一个List是否为null通常使用`list != null`这种语法。然而,有时候你会发现这种断无效,可能是因为List对象实际上是一个集合(empty list),而不是null。以下是一些常见的原因和解决方法: 1. **List对象是一个集合**: 如果List对象被初始化但没有添加任何元素,它将是一个集合,而不是null。因此,`list != null`会返回`true`,但`list.isEmpty()`会返回`true`。 2. **List对象是一个引用**: 如果List对象没有被初始化,它将是null。此时,`list != null`会返回`false`。 3. **使用了不可变集合**: 如果List对象是不可变集合(如`Collections.emptyList()`),它将永远是一个集合,而不是null。因此,`list != null`会返回`true`,但`list.isEmpty()`会返回`true`。 ### 示例代码 ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ListCheckExample { public static void main(String[] args) { List<String> list1 = new ArrayList<>(); List<String> list2 = null; List<String> list3 = Collections.emptyList(); System.out.println("list1 != null: " + (list1 != null)); // true System.out.println("list1.isEmpty(): " + list1.isEmpty()); // true System.out.println("list2 != null: " + (list2 != null)); // false System.out.println("list3 != null: " + (list3 != null)); // true System.out.println("list3.isEmpty(): " + list3.isEmpty()); // true } } ``` ### 解决方法 1. **检查是否为null**: ```java if (list != null) { // List不为null } ``` 2. **检查是否为集合**: ```java if (list != null && !list.isEmpty()) { // List不为null且不为 } ``` 3. **使用Optional**: ```java import java.util.Optional; Optional.ofNullable(list) .ifPresent(l -> { // List不为null }); ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值