用java的stream流库在实际项目的使用案例

2023-10-27

由于自己用stream+lambda很不熟悉,用文章记录在一个电商项目中的用法
购物车模块:

		//获取购物车,校验(是否有商品、库存)
		List<Cart> cartList = cartService.listForCart(uid).stream()
				.filter(Cart::getProductSelected)
				.collect(Collectors.toList());

订单模块:

//获取cartList里的productIds
		Set<Integer> productIdSet = cartList.stream()
				.map(Cart::getProductId)
				.collect(Collectors.toSet());
		List<Product> productList = productMapper.selectByProductIdSet(productIdSet);
		Map<Integer, Product> map  = productList.stream()
				.collect(Collectors.toMap(Product::getId, product -> product));
					List<OrderItem> orderItemList = new ArrayList<>();
		Long orderNo = generateOrderNo();
		for (Cart cart : cartList) {
			//根据productId查数据库
			Product product = map.get(cart.getProductId());
			//是否有商品
			if (product == null) {
				return ResponseVo.error(ResponseEnum.PRODUCT_NOT_EXIST,
						"商品不存在. productId = " + cart.getProductId());
			}
			//商品上下架状态
			if (!ProductStatusEnum.ON_SALE.getCode().equals(product.getStatus())) {
				return ResponseVo.error(ResponseEnum.PRODUCT_OFF_SALE_OR_DELETE,
						"商品不是在售状态. " + product.getName());
			}
			}

返回订单视图

	private OrderVo buildOrderVo(Order order, List<OrderItem> orderItemList, Shipping shipping) {
		OrderVo orderVo = new OrderVo();
		BeanUtils.copyProperties(order, orderVo);

		List<OrderItemVo> OrderItemVoList = orderItemList.stream().map(e -> {
			OrderItemVo orderItemVo = new OrderItemVo();
			BeanUtils.copyProperties(e, orderItemVo);
			return orderItemVo;
		}).collect(Collectors.toList());
		orderVo.setOrderItemVoList(OrderItemVoList);

		if (shipping != null) {
			orderVo.setShippingId(shipping.getId());
			orderVo.setShippingVo(shipping);
		}

		return orderVo;
	}

创建订单

private Order buildOrder(Integer uid,
							 Long orderNo,
							 Integer shippingId,
							 List<OrderItem> orderItemList
							 ) {
		BigDecimal payment = orderItemList.stream()
				.map(OrderItem::getTotalPrice)
				.reduce(BigDecimal.ZERO, BigDecimal::add);

		Order order = new Order();
		order.setOrderNo(orderNo);
		order.setUserId(uid);
		order.setShippingId(shippingId);
		order.setPayment(payment);
		order.setPaymentType(PaymentTypeEnum.PAY_ONLINE.getCode());
		order.setPostage(0);
		order.setStatus(OrderStatusEnum.NO_PAY.getCode());
		return order;
	}

获取订单列表

	@Override
	public ResponseVo<PageInfo> list(Integer uid, Integer pageNum, Integer pageSize) {
		PageHelper.startPage(pageNum, pageSize);
		List<Order> orderList = orderMapper.selectByUid(uid);

		Set<Long> orderNoSet = orderList.stream()
				.map(Order::getOrderNo)
				.collect(Collectors.toSet());
		List<OrderItem> orderItemList = orderItemMapper.selectByOrderNoSet(orderNoSet);
		Map<Long, List<OrderItem>> orderItemMap = orderItemList.stream()
				.collect(Collectors.groupingBy(OrderItem::getOrderNo));

		Set<Integer> shippingIdSet = orderList.stream()
				.map(Order::getShippingId)
				.collect(Collectors.toSet());
		List<Shipping> shippingList = shippingMapper.selectByIdSet(shippingIdSet);
		Map<Integer, Shipping> shippingMap = shippingList.stream()
				.collect(Collectors.toMap(Shipping::getId, shipping -> shipping));

		List<OrderVo> orderVoList = new ArrayList<>();
		for (Order order : orderList) {
			OrderVo orderVo = buildOrderVo(order,
					orderItemMap.get(order.getOrderNo()),
					shippingMap.get(order.getShippingId()));
			orderVoList.add(orderVo);
		}
		PageInfo pageInfo = new PageInfo<>(orderList);
		pageInfo.setList(orderVoList);

		return ResponseVo.success(pageInfo);
	}

关于Collectors.groupingBy:根据一个或多个属性对集合中的项目进行分组,返回一个map:

Map<Integer, List<Integer>> mapGroupBy = Stream.of(1, 2, 3, 4, 5, 4, 3).collect(Collectors.groupingBy(x -> x * 10));
System.out.println(mapGroupBy); // {50=[5], 20=[2], 40=[4, 4], 10=[1], 30=[3, 3]}
for(Map.Entry entry:mapGroupBy.entrySet())
{
    System.out.print(entry.getKey()+":");
    System.out.println(String.valueOf(entry.getValue()));
}


在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用java的stream流库在实际项目的使用案例 的相关文章

随机推荐

  • Feign远程调用的底层方法逻辑

    今天在写业务的时候 需要通过feign调用远程接口 平常只是调用就行了 没有了解到他是如何代码实现的 今天就使用debug来解开feign为什么可以远程调用的面纱 希望看本文章的同学朋友们 可以自己写一个简单的远程调用方法跟着我一起走一遍d
  • No.13 免费音乐软件推荐:轻松畅听全网音乐

    这些开源音乐软件为用户提供了丰富的音乐搜索和播放功能 让您可以享受高品质的音乐畅听体验 它们支持多种音乐平台 如网易云音乐 QQ音乐 酷狗音乐等 同时提供了自动切换播放源 精选歌单 数据同步等实用功能 选择这些项目 您将能够轻松搜索 播放和
  • C/C++ 语言实现使用LU分解求解线性方程组

    应用计算方法C语言程序 02 接应用计算方法C语言程序 01 C C 语言实现矩阵LU分解 Doolittle A 以计算方法课本例题4 6为例 设矩阵A b分别为 A 3 3 1 3 3 2 1 1 2 3 4 b 3 1 2 1 利用C
  • oracle随机数 — dbms_random

    oracle随机数 dbms random ORACLE的PL SQL提供了生成随机数和随机字符串的多种方式 罗列如下 1 小数 0 1 select dbms random value from dual more 2 指定范围内的小数
  • fseek用法:int fseek(FILE *stream, long offset, int origin);

    1 SEEK SET 从文件开头开始定位 参数必须大于0 2 SEEK CUR 从文件当前位置开始定位 参数可正可负 3 SEEK END 从文件末尾开始定位 参数必须小于0 include
  • (附源码)springboot自习室座位预约系统 毕业设计674156

    springboot自习室座位预约系统 摘要 在社会快速发展的影响下 教育事业蓬勃发展 大大增加了学校的数量 多样性 教育质量等要求 使教育的管理和运营比过去更加困难 依照这一现实为基础 设计一个快捷而又方便的自习室座位预约系统是一项十分重
  • 判断聚类 n_clusters

    目录 基本原理 代码实现 肘部法则 Elbow Method 轮廓系数 Silhouette Coefficient Gap Statistic 间隙统计量 Calinski Harabasz Index Calinski Harabasz
  • js中对new Date() 中转换字符串方法toLocaleString的使用。

    提供特定于区域设置的日期和时间格式 dateTimeFormatObj new Intl DateTimeFormat locales options dateTimeFormatObj 必需 将 DateTimeFormat 对象分配到的
  • 《C++ Primer Plus》第四章 复合类型 4.12复习题答案

    1 char actor 30 0 short bstsie 100 0 float chuck 13 0 long double dipsea 64 0 2 array
  • QT 窗口与视口(setWindow/setViewPort)的一些理解与整理

    QPainter drawRect QRectF 绘制图形传入的是世界坐标 而后经过变换矩形变为窗口坐标 最后经过窗口 视口变换变为设备坐标 其中世界坐标系和窗口坐标系都属于逻辑坐标系 设备坐标系属于物理坐标 世界坐标 窗口坐标和设备坐标
  • ffmpeg编译,ffplay播放RTSP流,音频格式为AAC-ELD

    rtspServer已经ready 音频格式为AAC ELD encoder 为libfdk aac 发现VLC和ffplay不能正常解码AAC ELD FFmpeg可以支持3钟AAC LC编码器 aac libfaac libfdk aa
  • 改变 el-dialog 的宽度

    在 el dialog 增加 customClass 且在全局 style 里 写 style 去掉scoped
  • VS2022 无法启动程序,不是有效的Win32应用程序

    如果这里确定是 exe了 那就点击生成 gt 重新生成解决方案 不要点击生成解决方案 那个没用 然后就行了
  • 登录数据库

    登录数据库 数据库 数据库是一个以某种有组织的方式存储的数据集合 理解数据库的一种最简单的办法是将其想象为一个文件柜 此文件柜是一个存放数据的物理位置 不管数据是什么以及如何组织的 数据库 database 就是保存有组织的数据的容器 通常
  • JSON.stringify()的深入用法——第2、3个参数

    第2个参数 作用 用于过滤 格式化 没有或者是null 则所有属性被序列化JSON stringify name Ben age 18 JSON stringify name Ben age 18 null name Ben age 18
  • 信息检索复习笔记

    第一讲 搜索 IR 信息检索是什么样的学科 实质上是融合了文本及多媒体检索 数据挖掘 机器学习和自然语言处理的综合学科 为什么要进行信息检索 信息过载 搜索 搜索的过程 从大规模非结构化数据 通常是文本 的集合 通常保存在计算机上 中找出满
  • java高级:注解

    目录 认识注解 自定义注解 元注解 解析注解 注解的应用场景 认识注解 自定义注解 注解和反射一样 都是用来做框架的 我们这里学习注解的目的其实是为了以后学习框架或者做框架做铺垫的 先来认识一下什么是注解 Java注解是代码中的特殊标记 比
  • linux配置定时crontab任务详细步骤

    liunx服务器系统为suse 以这个为例 每一步都进行过测试 请按照步骤来 1 首先查看服务器crontab任务 crontab l 出现上图 表示没有配置任何定时任务 如果出现no crontab for root不用管 2 创建执行脚
  • 2020全国职业技能大赛嘉兴市“网络空间安全赛项”赛题及赛题解析(超详细)

    2021年中职组 网络空间安全 赛项 一 嘉兴市竞赛任务书 二 任务书解析 三 任务书答案 四 不懂的可以私信博主 一 嘉兴市竞赛任务书 一 竞赛时间 8 00 11 00 共计180分钟 二 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时
  • 用java的stream流库在实际项目的使用案例

    由于自己用stream lambda很不熟悉 用文章记录在一个电商项目中的用法 购物车模块 获取购物车 校验 是否有商品 库存 List