在 Java 中如何优雅地判空

package NullObject;

import java.util.Optional;

public class Test {
    public static void main(String[] args) {
        //空值处理1 NullObject模式
        Factory.get(new Depedency()).operation();
        //空值处理2 java8 处理方式
        new Test().test2(new Test4());
    }

    //普通处理方式
    private void test(Test4 test4) {
        if (test4 != null) {
            test4.getTest3();
            if (test4.getTest3() != null) {
                test4.getTest3().getTest2();
                if (test4.getTest3().getTest2() != null) {
                    test4.getTest3().getTest2().getInfo();
                }
            }
        }
    }

    //java8实现方式
    private void test2(Test4 test4) {
        //filter,map,flatMap,这几个操作跟Stream的处理类似,只是要注意flatMap处理必须手动指定返回类型为Optional
        //但是flatMap要求Test3::getTest2返回值为Optional类型,而map不需要,
        //flatMap不会多层包装,map返回会再次包装Optional;
        Object obj = Optional.ofNullable(test4)
                .flatMap(t -> Optional.ofNullable(t.getTest3()))
                .flatMap(t -> Optional.ofNullable(t.getTest2()))
                .map(Test2::getInfo)
                .orElse("空值");
        Object o = Optional.ofNullable(test4)
                .map(Test4::getTest3)
                .map(Test3::getTest2)
                .map(Test2::getInfo)
                .orElse("空值");
        System.out.println(obj);
        System.out.println(o);
    }

}

class Test2 {
    public String getInfo() {
        System.out.println("数据获取成功");
        return null;
    }

}

class Test3 {
    public Test2 getTest2() {
        System.out.println("Test3 获取 Test2");
        return new Test2();
    }
}

class Test4 {
    public Test3 getTest3() {
        System.out.println("Test4 获取 test3");
        return null;
    }
}

//工厂模式处理NullPointException
//Nullable是空对象的相关操作接口,用于确定对象是否为空,因为在空对象模式中,
// 对象为空会被包装成一个Object,成为NullObject,该对象会对原有对象的所有方法进行空实现
interface Nullable {
    boolean isNull();
}

interface DepedencyBase extends Nullable {
    void operation();
}

class NullObject implements DepedencyBase {
    @Override
    public boolean isNull() {
        return false;
    }

    @Override
    public void operation() {
        System.out.println("do nothing");
    }
}

class Depedency implements DepedencyBase {
    @Override
    public boolean isNull() {
        return true;
    }

    @Override
    public void operation() {
        System.out.println("operation");
    }
}

class Factory {
    public static DepedencyBase get(DepedencyBase depedencyBase) {
        if (depedencyBase == null) {
            return new NullObject();
        }
        return depedencyBase;
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值