关于Stream流的peek方法解析
peek方法是一个中间操作,它的主要用途是观察流中的元素,同时支持对流元素进行调试或执行无副作用的操作
1.调试和日志记录
用于调试时查看流程里过程中某个阶段的元素状态,而无需修改流的内容。
2.观察中间操作的结果
由于流是惰性求值的(lazy),只有终止操作(如 collect、forEach)被调用时,中间操作才会执行。peek 可以在多个中间操作之间插入,观察每一步的处理结果。
3.与for Each的区别
peek是中间操作: 必须与终止操作结合使用才会触发执行
forEach是终止操作:直接触发流处理,但不再返回流
4.可以使用peek方法将自己所封装的工具类
couponList.stream()
// 1.计算优惠金额
//CouponUtils是自己所封装的计算优惠金额的工具类,通过peek方法在流的中间计算
.peek(coupon -> coupon.setDiscountAmount(CouponUtils.calDiscountAmount(coupon, totalAmount)))
// 2.优惠金额大于0且优惠金额小于订单金额
.filter(coupon -> coupon.getDiscountAmount().compareTo(BigDecimal.ZERO) > 0 && coupon.getDiscountAmount().compareTo(totalAmount) < 0)
// 3.类型转换
.map(coupon -> BeanUtils.toBean(coupon, AvailableCouponsResDTO.class))
// 4.优惠金额倒序
.sorted(Comparator.comparing(AvailableCouponsResDTO::getDiscountAmount).reversed())
.collect(Collectors.toList());
5.总结:
peek 最适合用于调试、日志记录或临时观察流处理过程中的元素状态。在正式代码中,若需修改流元素,优先使用 map、filter 等明确语义的操作。
浙公网安备 33010602011771号