目录
一、通过Optional优化多层嵌套if语句
package com.wzx;
public class Test {
/**
* 获取某个订单的用户的详细地址的长度
* @param orderId
* @throws Exception
*/
public void getOrderDetailAddress(String orderId) throws Exception {
Order order = getOrderDetail(orderId);
int length = 0;
if (order != null) {
User user = order.getUser();
if (user != null) {
Address address = user.getAddress();
if (address != null) {
String detailAddress = address.getDetailAddress();
if (!"".equals(detailAddress)) {
length = detailAddress.length();
}
}
}
}
}
public Order getOrderDetail(String orderId) throws Exception {
return new Order();
}
}
我们在实际项目的开发过程中经常会看到这种多层嵌套的if非空判断语句,这种写法不管是从可读性、维护性、扩展性还是系统性能而言,都是非常艰难且具有挑战性的。对于这样的代码,自JDK 8开始,我们通过Optional就可以将它改善的非常简洁:
package com.wzx;
import java.util.Optional;
public class Test {
/**
* 获取某个订单的用户的详细地址的长度
* @param orderId
* @throws Exception
*/
public void getOrderDetailAddress(String orderId) throws Exception {
Order order = getOrderDetail(orderId);
int length = 0;
if (order != null) {
User user = order.getUser();
if (user != null) {
Address address = user.getAddress();
if (address != null) {
String detailAddress = address.getDetailAddress();
if (!"".equals(detailAddress)) {
length = detailAddress.length();
}
}
}
}
}
/**
* 优化后的代码
* @param orderId
* @throws Exception
*/
public void getOrderDetailAddress2(String orderId) throws Exception {
Order order = getOrderDetail(orderId);
Integer length = Optional.ofNullable(order)
.map(Order::getUser)
.map(User::getAddress)
.map(Address::getDetailAddress)
.map(String::length)
// 我们页可以选择.orElseThrow()抛出一个异常
// 也可以选择.orElseGet()通过传入一个函数式接口来获取一个返回值
.orElse(0);
}
public Order getOrderDetail(String orderId) throws Exception {
return new Order();
}
}
二、if判空的两种写法
不推荐:
public OrderDTO convert2(Order order) {
if (order != null) {
OrderDTO orderDTO = new OrderDTO();
// todo
return orderDTO;
}
return null;
}
推荐:
public OrderDTO convert1(Order order) {
if (order == null) {
return null;
}
OrderDTO orderDTO = new OrderDTO();
// todo
return orderDTO;
}
我们在日常开发过程中,肯定见过上述两种写法的if判空语句,两种写法都能实现我们的业务逻辑非空判断。之所以推荐第二种写法,是因为通过这种提前判空回执,能够尽可能地减少代码嵌套的层级数,增加代码的可读性、可维护性和可扩展性。
public OrderDTO convert1(Order order) {
if (order == null) {
return null;
}
if (order.getUser() == null) {
return null;
}
OrderDTO orderDTO = new OrderDTO();
// todo
return orderDTO;
}
public OrderDTO convert2(Order order) {
if (order != null) {
OrderDTO orderDTO = new OrderDTO();
if (order.getUser() != null) {
return orderDTO;
}
}
return null;
}