由于写 kotlin 写的比较多,后面发现 Java 在 switch 时接收返回值比较麻烦,在这里学到了一个新的关键字yield搭配 switch 使用。
比如这种场景我需要返回值,有需要调用方法的情况。

int dayOfWeek = 3;
String word = switch(dayOfWeek) {
    case 1 -> "星期一";
    case 2 -> "星期二";
    case 3 -> "星期三";
    default -> "星期---";
};

大多数时候,在 switch 表达式内部,我们会返回简单的值,这个时候就像上面一样将返回的值写在 -> 之后就行。但是,如果需要复杂的语句,例如写了很多语句放到 { } 中,那么此时,如何在此分支中返回一个值呢?这就需要用到 yield 关键字。

int dayOfWeek = 3;
String word = switch(dayOfWeek) {
    case 1 -> "星期一";
    case 2 -> "星期二";
    case 3 -> "星期三";
    default -> {
        // 这里就可以执行业务逻辑
        doSomething();
        // 通过 yield 返回一个值
        yield result;
    }
};

实际场景类似这样,下面是部分伪代码,需要加上一些判断逻辑并返回时,使用yield就可以类似 kotlin 中的when(dayOfWeek)操作:

     * 计算单个商品金额
     *
     * @param goods                       商品信息
     * @param storeBatchDiscountPageVoMap 商品编码到按瓶销售价映射
     * @param discountPrice               折扣单价(按公斤称重单价)
     * @param isDelivery                  是否为配送员类型发票
     * @return BigDecimal 计算后的单个商品金额
     */
    private BigDecimal calculateAmount(InvoiceGoodInfoDTO goods,
                                       Map<String, StoreBatchDiscountPageVo> storeBatchDiscountPageVoMap,
                                       BigDecimal discountPrice, boolean isDelivery, PrintInvoiceDTO req, Map<String, Map<Integer, Integer>> priceMap) {
        BigDecimal unitPrice = getUnitPrice(goods, storeBatchDiscountPageVoMap, discountPrice, isDelivery, req, priceMap);
        val invoicingPriceTypeEnum = InvoicingPriceTypeEnum.getByCode(goods.getPriceType());
        return switch (invoicingPriceTypeEnum) {
            // 按公斤计价
            case KG -> {
                if (goods.getGoodsWeight() > 0) {
                    // 正常情况
                    yield unitPrice.multiply(xxx);
                } else if (goods.getGoodsWeight() < 0) {
                    // 余气回收这种特殊情况处理,不计算数量
                    yield unitPrice.multiply(xxx);
                } else {
                    throw new BizServiceException();
                }
            }
            // 按数量计价
            case NUMBER -> unitPrice.multiply(xxx);
        };
    }