• 奔跑的猪
    2019-07-26
    实践中大量采用stream大概有2年了吧,先是在Team内推广,后来在CodeReview中强制要求。
    个人以为,出发点并不是出于性能考虑,而是结合lambda,在编程思维上的转变,将大家对代码的关注点放在“行为传递”上面,而不是参数传递,阅读时也能省去模板语法产生的“噪音”。
    
     14
  • 小白猪
    2019-06-01
    思考题,由于流是并行处理,parallelList会存在并发问题,应该使用collect方法聚合
    
     13
  • 陆离
    2019-06-01
    思考题中这样的方式会造成null值和缺值
    因为arraylist不是线程安全的,例如线程一在size++后准备给index为size+1的位置赋值,这个时候第二个线程又给size++,这个线程一赋值的index就变成了size+2,在线程一赋值后,线程二又在size+2的位置赋值。
    这样的结果就是size+1的位置没有值null,size+2的位置为线程二赋的值,线程一赋的值被覆盖。
    正确的方式应该是使用collect()
    
     10
  • (´田ω田`)
    2019-06-01
    感觉这一节课已经值回了整个课程的票价,给老师点赞!

    思考题:Stream并行执行,无法确认每个元素的处理顺序,最后parallelList中的数字是无序的

    作者回复: 思考题中的问题是在并行操作arraylist时,需要考虑线程安全问题

    
     6
  • 一路看风景
    2019-06-01
    老师您好,在容器盛行的微服务环境下,以及大数据处理流行的潮流中,我觉得stream的应用空间多少有些尴尬呢,不知是不是我的理解有误。即:单核容器运行的环境下stream没了性能优势,大数据的处理又有大数据平台去完成使命,所以是不是意味着我们可以从stream得到的最大收益变成了流式编程和函数式编程带来的代码易读和易用性了呢?

    作者回复: 是的,但未必所有公司都有构建大数据的能力,而且一些公司有自己的中间件团队,例如文章开始说到的分表分库的查询操作,使用stream的并行操作就有优势了

     1
     4
  • Loubobooo
    2019-06-01
    parallelList集合里呈现的是无序的数字,是这样吗?

    作者回复: 对的,可能会出现少数字、无序以及异常情况

    
     4
  • 圣西罗
    2019-06-01
    老师,现在网上有些说法做测试用lambda比普通for循环速度慢五倍,因此有人拒绝用。实际情况是什么样呢?如果我自己想测,应该怎么尽可能排除外因干扰,测一下他们的实际效率对比?

    作者回复: 当应用程序以前没有使用lambda表达式时,会动态生成lambda目标对象,这是导致慢的实际原因。我们可以在运行加载后,也就是初次测试之后,紧接着后面加几个for循环,再测试几次,对比下性能。

    虽然单独使用lambda表达式在初次运行时要比传统方式慢很多,但结合stream的并行操作,在多核环境下还有有优势的。

    
     3
  • Andy
    2019-10-21
    感觉stream这种中间操作和终结操作 跟spark中转换操作和处理操作 思想很像,懒加载

    作者回复: 是的,好的实现思想会被应用到各个地方

    
     2
  • N
    2019-07-14
    老师有个问题请教一下,公司业务代码中有大量stream对集合遍历,过滤,聚合的用法,但都是串行的,因为大部分数据量不是很大,请问数据量多大的时候才有必要使用并行提高效率呢?

    作者回复: 上万数量级使用并行可以提高效率。

    
     2
  • 阿厚
    2019-06-06
    老师,请教2个问题:
    1.有什么分表分库中间件推荐么?
    2.分表分库以后,查询分页怎么办呢?

    作者回复: 之前用过sharing-jdbc以及mycat,一个明显的区别是sharing-jdbc是嵌入方式,而mycat是基于proxy,所以理论上来说 proxy方式会有性能损耗。现在我们在使用sharing-jdbc,这里不打广告,两个中间件都有自己的优势。

    分页查询是基于我这篇文章说的方式,将每个分表的数据结果集查询出来,通过归并排序计算出。
    具体的实现方式有区别,本次专栏的后面课程也会具体讲到。

    
     2
  • Darren
    2019-06-04
    最终的结果无序,且可能结果都是不正确的,因为ArrayList是线程不安全的
    
     2
  • QQ怪
    2019-06-03
    是不是该把思考题中的arraylist换成线程安全的copyOnwriteList就可以解决线程不安全问题?

    作者回复: 对的,但copyOnwriteList更适合某一时间段统一新增,且新增时避免大量操作容器发生。比较适合在深夜更新黑名单类似的业务。

    
     2
  • 小辉辉
    2019-06-02
    ArrayList是线程不安全的集合,而当前又用了并行流去处理,所以会出现有异常、少数据或者正常输出结果这三种情况。
    
     2
  • bro.
    2019-06-01
    老师,这么早更新,读完感觉跟rxjava设计思想很接近,不订阅前面过滤条件都不会真正的运行!
    
     2
  • 开心小毛
    2019-11-19
    使用stream是否有节省内存消耗的考虑,例如当需要遍历一个含上万条目的数据库查询结果。
    
     1
  • 郑晨Cc
    2019-06-03
    课程好值啊 全是干货
    
     1
  • Liam
    2019-06-01
    parallel Stream 的并发机制是通过ForkJoinPool实现的,它的通用线程池是一个无界队列,想问下,数据量很大的时候,比如1w个元素,它分片的依据是什么,每个分片多大;子任务比较多的时候,会不会严重消耗内存以及频繁触发GC等
    
     1
  • Liam
    2019-06-01
    并发操作一个ArrayList,会有线程安全问题?

    作者回复: 对的

    
     1
  • 辉煌码农
    2020-01-02
    allMatch为什么是短路呢,短路的如何定义的呢

    作者回复: 终结操作又可以分为短路(Short-circuiting)与非短路(Unshort-circuiting)操作,前者是指遇到某些符合条件的元素就可以得到最终结果,后者是指必须处理完所有元素才能得到最终结果。

    allMatch也是属于遇到某些条件的情况下可以终结的操作,即找到一个不合法条件的,短路返回false ,无需等待其他的处理结果,所以也属于短路。

    
    
  • 遇见
    2019-12-17
    "这个例子的需求是查找出一个长度最长,并且以张为姓氏的名字"

    文稿中的代码只能获取到名字最长的长度吧? 是获取不到名字最长的名字的, 最后的toString只能得到 "OptionalInt[4]" 得不到 "张五六七"

    改成:

    "names.stream()
                    .filter(name -> name.startsWith("张")).max(Comparator.comparingInt(String::length))
                    .ifPresent(System.out::println);"

    才可以打印出来名字
    展开

    作者回复: 是的

    
    
我们在线,来聊聊吧