敲黑板:
关于这里的说明,有小伙伴会提出过疑问,就是这个场景其实使用 String.join() 就可以搞定了,并不需要上面使用 stream 的方式去实现。这里要声明下,Stream的魅力之处就在于其可 以结合到其它的业务逻辑中进行处理,让代码逻辑更加的自然、一气呵成。如果纯粹是个String 字符串拼接的诉求,确实没有必要使用Stream来实现,毕竟杀鸡焉用牛刀嘛~ 但是可以看看下面给出的这个示例,便可以感受出使用Stream进行字符串拼接的真正魅力所在
数据批量数学运算
还有一种场景,实际使用的时候可能会比较少,就是使用collect生成数字数据的总和信息,也可 以了解下实现方式:
publicvoidtestNumberCalculate() { List<Integer>ids=Arrays.asList(10, 20, 30, 40, 50); // 计算平均值Doubleaverage=ids.stream().collect(Collectors.averagingInt(value->value)); System.out.println("平均值:"+average); // 数据统计信息IntSummaryStatisticssummary=ids.stream().collect(Collectors.summarizingInt(value->value)); System.out.println("数据统计信息: "+summary); }
上面的例子中,使用collect方法来对list中元素值进行数学运算,结果如下:
平均值:30.0总和:IntSummaryStatistics{count=5, sum=150, min=10, average=30.000000,max=50}
总结
到这里,关于JAVA Stream的相关概念与用法介绍,基本就讲完了。
Stream相较于传统的foreach的方式处理stream,到底有啥优势?
根据前面的介绍,我们应该可以得出如下几点答案:
- 代码更简洁、偏声明式的编码风格,更容易体现出代码的逻辑意图
- 逻辑间解耦,一个stream中间处理逻辑,无需关注上游与下游的内容,只需要按约定实现 自身逻辑即可
- 并行流场景效率会比迭代器逐个循环更高
- 函数式接口,延迟执行的特性,中间管道操作不管有多少步骤都不会立即执行,只有遇到终 止操作的时候才会开始执行,可以避免一些中间不必要的操作消耗
当然了,Stream也不全是优点,在有些方面也有其弊端:
- 代码调测debug不便
- 程序员从历史写法切换到Stream时,需要一定的适应时间