限时抢购网站源码,seo专员的工作内容,应用asp做网站,蛋糕店网页设计素材一、概述
Java8提供了lambda表达式#xff0c;方便我们对数据集合进行操作#xff0c;我们使用lambda表达式的时候#xff0c;是不是有这样的疑问#xff0c;如何对执行过程中的中间数据进行调试呢#xff1f;
二、例子
在下面的例子中#xff0c;我们实现随机最多生成…一、概述
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-