关于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 等明确语义的操作。

posted @ 2025-04-11 19:38  留梦&  阅读(230)  评论(0)    收藏  举报