Java Stream之面试官和你

面试官:介绍下Java的Stream。

你:Stream就是可以对一个集合类的数据进行聚合操作。可以是串行,也可以是并行的。

 

面试官:那Stream具体是如何遍历数据的?

你:Stream的遍历主要经过 数据源,中间操作,终结操作。中间操作不会处理数据,只是对每个操作进行记录并且返回一个流,终结操作才会进行计算。

 

面试官:那你说的这个中间操作和终结操作指的是什么?

你:中间操作就是filter,map这类函数。终结操作就是max,collect这类函数。中间操作分为有状态和无状态的,有状态的操作需要集合中所有的元素,无状态不需要且只关心当前的。终结操作分为短路和非短路的操作,短路操作就是可以立即停止,只要处理完复合条件的元素,而非短路的则需要把所有元素都处理完。

 

面试官:中间操作的有状态和无状态的操作有哪些?

你:有状态的有distinct,sorted,limit,skip。无状态的有filter,map,peek,unordered等。

 

面试官:终结操作的短路和非短路的操作有哪些?

你:短路的操作有anyMatch,allMatch,findAny,findFIrst,noneMatch ,非短路的操作有max,min,count,collect,reduce,toArray,forEach,forEachOrdered。

 

面试官:你之前说可以支持并行操作,可以介绍下吗?

你:parallelStream就是利用的ForkJoin框架实现的,就是先分片,再合并。分片利用了Splititerator的estimateSize估算出分片的数量。

 

面试官:介绍下ForkJoin框架?

你:ForkJoin主要还是利用了线程池的思想,它的核心就是一个ForkJoinPool,线程池内的线程一次只能执行一个task,而每个线程在线程池里还有一个对应的双向队列deque,线程不仅可以从自己的双向队列里拿task,如何线程自身的队列空了,它还可以去帮其他没做完的线程,从繁忙的线程的双向队列的尾部取出task执行,这就是work-stealing算法,这个可以平衡线程的工作负载,从总体上提高了速度,不要等待最慢的线程。

 

面试官:那ForkJoin和ExecutorService的区别是什么?

你:他们都有各自的应用场景,ForkJoin是可以自动分片和聚合操作,而ExecutorService则要手动。ForkJoin适合处理同一种任务时,进行提速,就是work-stealing的算法的帮助,而ExecutorService适合同时处理多种不同或者相同的任务,但是无法再提速。

 

面试官:看完不点赞收藏吗?

你:下次一定

 

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值