下单商品信息类
/**
* 下单商品信息对象
*/
public class Sku {
// 编号
private Integer skuId;
// 商品名称
private String skuName;
// 单价
private Double skuPrice;
// 购买个数
private Integer totalNum;
// 总价
private Double totalPrice;
// 商品类型
private Enum skuCategory;
/**
* 构造函数
* @param skuId
* @param skuName
* @param skuPrice
* @param totalNum
* @param totalPrice
* @param skuCategory
*/
public Sku(Integer skuId, String skuName,
Double skuPrice, Integer totalNum,
Double totalPrice, Enum skuCategory) {
this.skuId = skuId;
this.skuName = skuName;
this.skuPrice = skuPrice;
this.totalNum = totalNum;
this.totalPrice = totalPrice;
this.skuCategory = skuCategory;
}
/**
* Get方法
* @return
*/
public Integer getSkuId() {
return skuId;
}
public String getSkuName() {
return skuName;
}
public Double getSkuPrice() {
return skuPrice;
}
public Integer getTotalNum() {
return totalNum;
}
public Double getTotalPrice() {
return totalPrice;
}
public Enum getSkuCategory() {
return skuCategory;
}
}
购物车类
/**
* 购物车服务类
*/
public class CartService {
// 加入到购物车中的商品信息
private static List<Sku> cartSkuList =
new ArrayList<Sku>(){
{
add(new Sku(654032, "无人机",
4999.00, 1,
4999.00, SkuCategoryEnum.ELECTRONICS));
add(new Sku(642934, "VR一体机",
2299.00, 1,
2299.00, SkuCategoryEnum.ELECTRONICS));
add(new Sku(645321, "纯色衬衫",
409.00, 3,
1227.00, SkuCategoryEnum.CLOTHING));
add(new Sku(654327, "牛仔裤",
528.00, 1,
528.00, SkuCategoryEnum.CLOTHING));
add(new Sku(675489, "跑步机",
2699.00, 1,
2699.00, SkuCategoryEnum.SPORTS));
add(new Sku(644564, "Java编程思想",
79.80, 1,
79.80, SkuCategoryEnum.BOOKS));
add(new Sku(678678, "Java核心技术",
149.00, 1,
149.00, SkuCategoryEnum.BOOKS));
add(new Sku(697894, "算法",
78.20, 1,
78.20, SkuCategoryEnum.BOOKS));
add(new Sku(696968, "TensorFlow进阶指南",
85.10, 1,
85.10, SkuCategoryEnum.BOOKS));
}
};
/**
* 获取商品信息列表
* @return
*/
public static List<Sku> getCartSkuList() {
return cartSkuList;
}
/**
* Version 1.0.0
* 找出购物车中所有电子产品
* @param cartSkuList
* @return
*/
public static List<Sku> filterElectronicsSkus(
List<Sku> cartSkuList) {
List<Sku> result = new ArrayList<Sku>();
for (Sku sku: cartSkuList) {
// 如果商品类型 等于 电子类
if (SkuCategoryEnum.ELECTRONICS.
equals(sku.getSkuCategory())) {
result.add(sku);
}
}
return result;
}
/**
* Version 2.0.0
* 根据传入商品类型参数,找出购物车中同种商品类型的商品列表
* @param cartSkuList
* @param category
* @return
*/
public static List<Sku> filterSkusByCategory(
List<Sku> cartSkuList, SkuCategoryEnum category) {
List<Sku> result = new ArrayList<Sku>();
for (Sku sku: cartSkuList) {
// 如果商品类型 等于 传入商品类型参数
if (category.equals(sku.getSkuCategory())) {
result.add(sku);
}
}
return result;
}
/**
* Version 3.0.0
* 支持通过商品类型或总价来过滤商品
* @param cartSkuList
* @param category
* @param totalPrice
* @param categoryOrPrice - true: 根据商品类型,false: 根据商品总价
* @return
*/
public static List<Sku> filterSkus(
List<Sku> cartSkuList, SkuCategoryEnum category,
Double totalPrice, Boolean categoryOrPrice) {
List<Sku> result = new ArrayList<Sku>();
for (Sku sku: cartSkuList) {
// 如果根据商品类型判断,sku类型与输入类型比较
// 如果根据商品总价判断,sku总价与输入总价比较
if (
(categoryOrPrice
&& category.equals(sku.getSkuCategory())
||
(!categoryOrPrice
&& sku.getTotalPrice() > totalPrice))) {
result.add(sku);
}
}
return result;
}
/**
* Version 4.0.0
* 根据不同的Sku判断标准,对Sku列表进行过滤
* @param cartSkuList
* @param predicate - 不同的Sku判断标准策略
* @return
*/
public static List<Sku> filterSkus(
List<Sku> cartSkuList, SkuPredicate predicate) {
List<Sku> result = new ArrayList<Sku>();
for (Sku sku: cartSkuList) {
// 根据不同的Sku判断标准策略,对Sku进行判断
if (predicate.test(sku)) {
result.add(sku);
}
}
return result;
}
}
商品枚举类
/**
* 商品类型枚举
*/
public enum SkuCategoryEnum {
CLOTHING(10, "服装类"),
ELECTRONICS(20, "数码类"),
SPORTS(30, "运动类"),
BOOKS(40, "图书类");
// 商品类型的编号
private Integer code;
// 商品类型的名称
private String name;
/**
* 构造函数
* @param code
* @param name
*/
SkuCategoryEnum(Integer code, String name) {
this.code = code;
this.name = name;
}
}
// 查找购物车中数码类商品
方式一(传统方式):
通过循环遍历购物车商品,判断每个商品的类型,将符合商品存储到一个新list集合返回
// 查找购物车中数码类商品
List<Sku> result =
CartService.filterElectronicsSkus(cartSkuList);
System.out.println(
JSON.toJSONString(result, true));
这种硬编码一旦改需求就显得力不从心
方式二:lambada
比如查询Sku的总价超出1000
/**
* Sku选择谓词接口
*/
public interface SkuPredicate {
/**
* 选择判断标准
* @param sku
* @return
*/
boolean test(Sku sku);
}
将对象实现使用lambada 方式,不管如何变动需求,只需写具体实现
// 过滤商品单价大于1000的商品
List<Sku> result = CartService.filterSkus(
cartSkuList,
(Sku sku) -> sku.getSkuPrice() > 1000);
System.out.println(JSON.toJSONString(
result, true));