当前位置: 首页 > news >正文

Lambda表达式如何进行调试

一、概述

Java8提供了lambda表达式,方便我们对数据集合进行操作,我们使用lambda表达式的时候,是不是有这样的疑问,如何对执行过程中的中间数据进行调试呢?

二、例子

在下面的例子中,我们实现随机最多生成10位[0,60)的数据,并使用[1,10) 随机数限定个数

import java.util.Random;
import java.util.stream.Collectors;import org.apache.commons.lang3.RandomUtils;
import org.junit.Test;/*** lambda借助peek()方法调试*/
public class DebugTest
{@Testpublic void test(){String result = new Random().ints(10, 0, 60).limit(RandomUtils.nextInt(1, 10)).mapToObj(String::valueOf).collect(Collectors.joining("."));System.out.println(result);}}

三、运行结果

18.20.21.56.47.36.13.28.36
51.7.34.37.45.20.9
37.9.10.51.36.59.31.40
6.57.50
30.32.48
51.12.35.48.42.38.55.20
51.47
47.33.49.55.13.9
45.30.56.12.30.25.41

四,问题

现在我想知道,执行过程中,是:
先生成10个满足要求的数据再执行limit操作 还是生成10个满足要求的数据过程中同时判断是否达到limit之后就停止生成

五、调试

我们可以借助Stream的peek()方法,来实现中间过程打印

import java.util.Random;
import java.util.stream.Collectors;import org.apache.commons.lang3.RandomUtils;
import org.junit.Test;/*** lambda借助peek()方法调试*/
public class DebugTest
{@Testpublic void test(){// 会生成10个随机数再limit还是达到limit就不再生成随机数String result = new Random().ints(10, 0, 60).peek(e -> System.out.println(e)) // debug.limit(RandomUtils.nextInt(1, 10)).mapToObj(String::valueOf).collect(Collectors.joining("."));System.out.println(result);}
}

执行结果就不放出来了,各位可自行运行测试!

六、注意点

需要注意的坑

坑一:peek() 不影响流的生成和消费

peek()是一个中间操作,它并不会终止流的处理流程,因此如果不跟一个终端操作(如collect(), forEach(), count()等),则peek()中的操作虽然会被执行,但整个流式处理链的结果不会有任何产出。换言之,只有当流被消耗时,peek()里的操作才会真正发生。

坑二:peek() 的执行次数取决于下游操作

peek()方法中的动作会在流的每个元素上执行一次,但具体执行多少次取决于下游的终端操作。例如,如果你在排序(sorted())前使用了peek(),而在排序后又使用了一次peek(),则同一个元素可能会被两次peek()。

坑三:并发流中的peek()行为

对于并行流,peek()操作的执行顺序没有保证,而且可能会多次执行(取决于JVM的具体调度)。如果你在并行流中依赖peek()的顺序性或唯一性,可能会遇到意想不到的问题。

坑四:资源管理

如果在peek()中打开了一些资源(如文件、数据库连接等),但在peek()内部并未妥善关闭它们,可能会导致资源泄露。因为在没有终端操作的情况下,流可能不会立即执行,资源也就无法及时释放。

坑五:对流元素的修改可能无效

peek()通常用于读取或打印流元素,而不是修改它们。虽然理论上可以尝试在peek()中修改元素,但由于流的惰性求值和可能的不可变性,这样的修改可能不会反映到源集合或后续流操作中。

-over-

http://www.lryc.cn/news/487595.html

相关文章:

  • C++ —— 剑斩旧我 破茧成蝶—C++11
  • HTML5好看的音乐播放器多种风格(附源码)
  • C++设计模式行为模式———迭代器模式中介者模式
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十五,解码相关,将h264文件进行帧分隔变成avpacket
  • 力扣 LeetCode 104. 二叉树的最大深度(Day7:二叉树)
  • 如何高效实现汤臣倍健营销云数据集成到SQLServer
  • Vue3中使用:deep修改element-plus的样式无效怎么办?
  • 具身智能之Isaac Gym使用
  • 【大数据学习 | Spark】spark-shell开发
  • 《Python制作动态爱心粒子特效》
  • Jmeter 如何导入证书并调用https请求
  • Python程序15个提速优化方法
  • 足球虚拟越位线技术FIFA OT(二)
  • centos7.9单机版安装K8s
  • 图像编辑一些概念:Image Reconstruction与Image Re-generation
  • 【STM32】在 STM32 USB 设备库添加新的设备类
  • 【Redis】Redis实现的消息队列
  • # Spring事务
  • Java学习笔记--数组常见算法:数组翻转,冒泡排序,二分查找
  • ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)
  • 7.STM32之通信接口《精讲》之USART通信---多字节数据收发(数据包的模式:HEX数据包和文本数据包)
  • 基于Vue+SpringBoot的求职招聘平台
  • WebRTC 和 WebSocket
  • 小车综合玩法--5.画地为牢
  • 数据库课程设计全流程:方法与实例解析
  • 用Ruby编写一个自动化测试脚本,验证网站登录功能的正确性。
  • 跳表 | 基本概念 | 代码实现
  • 分数加减
  • 基于卷积神经网络的皮肤病识别系统(pytorch框架,python源码,GUI界面,前端界面)
  • QT与嵌入式——获取网络实时时间