防止空指针优雅的写法

本文通过示例展示了如何利用Java 8中的Optional类来改进空值检查的代码,减少冗余的null检查,提高代码的可读性和安全性。示例中包括了Optional的orElse、orElseGet、orElseThrow等方法的使用,以及在获取复杂对象属性时的链式调用,展示了Optional在处理可能为空的对象时的优雅方式。
摘要由CSDN通过智能技术生成

使用Optional

public static void main(String[] args) {
	BigDecimal decimal = null;
	//如果为空则默认值为123
	BigDecimal a = Optional.ofNullable(decimal).orElseGet(()->new BigDecimal("123"));
	//只有为空时调用newOne方法生成999
	BigDecimal b = Optional.ofNullable(decimal).orElseGet(()->newOne());
	//不管是否为空都会执行handleOne方法,只有为空才使用newOne方法返回值987
	BigDecimal c = Optional.ofNullable(decimal).orElse(handleOne());
	//为空直接抛异常
	BigDecimal d = Optional.ofNullable(decimal).orElseThrow(()->new ValidException("这玩意不能为空,懂?"));
	System.out.println(a);
}

private static BigDecimal handleOne(){
	BigDecimal a = new BigDecimal("987");
	//TODO 还可以干点别的
	System.out.println(a);
	return a;
}

private static BigDecimal newOne(){
	BigDecimal a = new BigDecimal("999");
	System.out.println(a);
	return a;
}

示例:

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("取值错误");
}
public String getCity(User user) throws Exception{
    return Optional.ofNullable(user)
                   .map(u-> u.getAddress())
                   .map(a->a.getCity())
                   .orElseThrow(()->new Exception("取指错误"));
}
if(user!=null){
    dosomething(user);
}
Optional.ofNullable(user)
    .ifPresent(u->{
        dosomething(u);
});
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;
    }
}
public User getUser(User user) {
    return Optional.ofNullable(user)
                   .filter(u->"zhangsan".equals(u.getName()))
                   .orElseGet(()-> {
                        User user1 = new User();
                        user1.setName("zhangsan");
                        return user1;
                   });
}
AcctBankCard acctBankCard = acctBankCardMapper.selAllByAcctId(acctId);
String end = "钱包";
if(acctBankCard!=null){
	if(acctBankCard.getBankAcctNo()!=null){
		if(acctBankCard.getBankAcctNo().length()>4){
			end = acctBankCard.getBankAcctNo().substring(acctBankCard.getBankAcctNo().length() - 4);
		}
	}
}
AcctBankCard acctBankCard = acctBankCardMapper.selAllByAcctId(acctId);
String end = Optional.ofNullable(acctBankCard).map(a->a.getBankAcctNo()).filter(v->v.length()>4).map(v->v.substring(v.length() - 4)).orElse("钱包");
TransOrder parentTransOrder = transOrderMapper.selTransOrderInfo(orderNo);
if(parentTransOrder!=null && parentTransOrder.getCashAcctId()!=null){
	AcctBankCard acctBankCard = transOrderDetailService.selAcctBankCardInfo(parentTransOrder.getCashAcctId());
	if(acctBankCard!=null){
		resp.setBank_name(acctBankCard.getBankName());
		resp.setBankCardShortName(acctBankCard.getBankCardShortName());
		resp.setBank_acct_no(acctBankCard.getBankAcctNo());
	}
}
Optional.ofNullable(parentTransOrder).map(TransOrder::getCashAcctId).ifPresent(v->{
	AcctBankCard acctBankCard = transOrderDetailService.selAcctBankCardInfo(v);
	Optional.ofNullable(acctBankCard).ifPresent(t->{
		resp.setBank_name(t.getBankName());
		resp.setBankCardShortName(t.getBankCardShortName());
		resp.setBank_acct_no(t.getBankAcctNo());
	});
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值