由于写 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);
};
}