概述
做过餐饮行业的,应该知道如下的业务场景:
门店的店员在跟供应商订货时,是有起订货量和最大订货量限制的。
比如说,门店想跟供应商订橙子这种物料,供应商会要求说,至少订货20斤,最大不能超过100斤。供应商这个要求是正常的,订的太少,供应商觉得吃亏了,订的太多,又供应不上。
而店员每次订货时,订货的物料又非常多,一个订货单,可能要订几十种水果。为了能让店员在订货时,明确的知道哪些水果订少了,哪些订多了,需要一次性把提示信息给到店员,方便店员调整水果的订货数。
用JAVA实现这样的需求,方法多种多样的,但这次,我想用Optional来实现。
使用Optional做订货接口的参数校验
Optional类有两个方法:
- isPresent():用于检查 Optional 对象内部是否有非空值
- isEmpty():用于检查 Optional 对象内部是否没有值
可以借助isPresent()方法的值来检查水果订货数量是否满足要求,下面用代码展示一下。
public class OrderUtils {
/**
* 校验水果物料的订货数量
*/
public static Optional<String> checkFruitMaterialOrderNum(BigDecimal orderNumFromParam, BigDecimal minOrderNum, BigDecimal maxOrderNum) {
if (orderNumFromParam == null) {
return Optional.empty();
}
// 检查用户购买数量是否在起订量和最大购买数之间
if (minOrderNum != null) {
if (orderNumFromParam.compareTo(minOrderNum) < 0) {
return Optional.of("订货量最小是" + minOrderNum);
}
}
if (maxOrderNum != null) {
if (orderNumFromParam.compareTo(maxOrderNum) > 0) {
return Optional.of("订货量不能超过" + maxOrderNum);
}
}
return Optional.empty();
}
}
当水果订货数不满足条件时,则使用Optional.of()方法将提示信息填入进去,否则返回Optional.empty()。下单接口需要校验数量时,可以如下使用:
JSONArray jsonArray = new JSONArray();
for (OrderDetail orderDetail : orderList) {
Optional<String> validateResult = OrderUtils.checkFruitMaterialOrderNum(orderDetail.getOrderNumFromParam(), MIN_ORDER_NUM, MAX_ORDER_NUM);
if (validateResult.isPresent()) {
String errorMsg = validateResult.get();
JSONObject jsonObject = new JSONObject();
jsonObject.put("materialName", orderDetail.getMaterialName());
jsonObject.put("msg", errorMsg);
jsonArray.add(jsonObject);
}
}
这样做的好处是除了可以批量收集到提示信息之外,调用方也无须处理异常,只需要根据isPresent()方法进行判断即可。
总结
当参数校验不通过,你不想抛出Exception时,也可以考虑使用Optional类来实现,由调用方去处理错误信息。