作者:微信小助手
发布时间:2018-09-18T08:55:32
为什么需要 Stream
Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的 Lambda 表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用 fork/join 并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用 Stream API 无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的 java.util.stream 是一个函数式语言+多核时代综合影响的产物。
1. Java 7 的排序、取值实现
而在 Java 8 使用 Stream,代码更加简洁易读;而且使用并发模式,程序执行速度更快。
2. Java 8 的排序、取值实现
3. 一个流操作的示例
stream() 获取当前小物件的 source,filter 和 mapToInt 为 intermediate 操作,进行数据筛选和转换,最后一个 sum() 为 terminal 操作,对符合条件的全部小物件作重量求和。
下面提供最常见的几种构造 Stream 的样例。
4. 构造流的几种常见方法
需要注意的是,对于基本数值型,目前有三种对应的包装类型 Stream:
IntStream、LongStream、DoubleStream。当然我们也可以用 Stream、Stream >、Stream,但是 boxing 和 unboxing 会很耗时,所以特别为这三种基本数值型提供了对应的 Stream。
Java 8 中还没有提供其它数值型 Stream,因为这将导致扩增的内容较多。而常规的数值型聚合运算可以通过上面三种 Stream 进行。
5. 数值流的构造
6. 转换大写
这段代码能把所有的单词转换为大写。
8. 平方数
9 一对多
Stream流里面还可以将多个集合转换至一个stream流中
10 使用foreach打印
对一个人员集合遍历,找出男性并打印姓名。可以看出来,forEach 是为 Lambda 而设计的,保持了最紧凑的风格。而且 Lambda 表达式本身是可以重用的,非常方便。当需要为多核系统优化时,可以 parallelStream().forEach(),只是此时原有元素的次序没法保证,并行的情况下将改变串行时操作的行为,此时 forEach 本身的实现不需要调整,而 Java8 以前的 for 循环 code 可能需要加入额外的多线程逻辑。
11 reduce 的使用用例
jdk8里面的reduce提供了相应的求和函数和最大值,最小值功能。
利用reduce和map的搭配,我们可以做一些数值流的转换功能,例如说:
12 filter去重筛选
java8里面的filter是最常用来去重的操作了,下面这个案例主要是演示如何使用filter来筛选数字。
13.Map和flatMap映射
使用map和flatmap的映射可以减少冗余代码的产生,更加地使得我们的代码精简化。
同时map也可以对于数组类型进行映射:
14.查找和匹配
jdk8里面提供了多种stream的函数,例如anyMatch,allMatch,noneMatch等
15.skip操作
jdk8里面的skip操作可以直接跳过相应的元素,它的作用正好和limit功能互补。
16.分组操作
之前在公司的项目里面就有用到过分组操作,这种操作主要可以用于优化类似于Map<String,List<Object>>的数据结构,案例如下:
使用groupby操作,直接可以将list中的每个元素,按照一定的规则来进行分类,这是一种特别高效率的手段
长按二维码
就可以关注我们啦~