使用JAVA 8的Optional做参数校验

概述


做过餐饮行业的,应该知道如下的业务场景:

门店的店员在跟供应商订货时,是有起订货量和最大订货量限制的。

比如说,门店想跟供应商订橙子这种物料,供应商会要求说,至少订货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类来实现,由调用方去处理错误信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值