java8中开启了流式编程。
今天我们来聊聊流失编程中的findAny和findFirst。
从二者的名字我们就能看出他们大概的功能了。
findFirst是从流中找出第一个元素。而findAny则是从流中找出任意一个元素。
是这样吗?我们来实际使用验证一下吧。
两个方法中一样的集合,分别调用执行了findAny和findFirst。为了验证执行的结果,对每个方法都做了10次循环。
让我们来看看执行后输出的结果是什么。
怎么输出的结果一样呢?
findFirst我们可以理解,就是找第一个元素。每次输出的内容一样没有问题。
可是findAny呢,不是说是找任意一个元素吗,怎么每次输出的也是一样啊。
大家有没有注意到对“names”这个集合做流化处理使用的是“stream”,这是串行流。如果我们的“names”是有序的,那findAny的任意一个都是第一个了。
既然有串行流,那我们来试试并行流吧。
大家注意看,我在代码中用红线做了标志,流已经从“stream”改成了“parallelStream”。
我们再来执行一下,看看这次的结果会不会是any,任意一个元素了。
这次的执行结果输出的不再都是第一个元素了,而是任意的一个元素了。有兴趣的朋友可以自己试着执行看看,每次执行的结果都可能会不同。
这里说到了串行流和并行流,那为什么要有串行流和并行流呢。
串行就是一个线程在处理业务,而并行流是会有多个线程来并发处理业务。
能够有多个线程同时处理业务的话,肯定是能更快速地完成业务流程。
但是对于一些对于执行顺序有强要求的,或者是并发可能会因为资源共享或争夺引发问题场景就不适合用并行流了。
那并行流是不是真的能提示效率,快速完成业务流程呢。
让我来试试吧。
示例代码中分别对串行流的findAny和并行流的findAny循环调用了100次(因为次数少不太能看出来效果)。然后分别对耗时做了一下输出。
那结果会是什么样的。
下面就来揭晓了。
从结果来看,串行流的findAny执行耗时是并行流的findAny执行耗时的3倍左右。
好了,今天我们聊了java8中的findAny与findFirst,也顺便了解了下并行流和串行流。希望对看到本文的朋友有所帮助。
新人朋友自己学习java的话可以看看下面这本书哦。