Java- 技术专题 -JDK8 新特性之 Stream 流
Stream流式思想概述
注意:Stream和IO流(InputStream/OutputStream)没有任何关系,请暂时忘记对传统IO流的固有印象!
Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工处理。Stream可以看作是流水线上的一个工序。在流水线上,通过多个工序让一个原材料加工成一个商品。
Stream API能让我们快速完成许多复杂的操作,如筛选、切片、映射、查找、去除重复,统计,匹配和归约;
获取Stream流的两种方式
java.util.stream.Stream 是JDK 8新加入的流接口;
获取一个流非常简单,有以下几种常用的方式:
所有的 Collection 集合都可以通过 stream 默认方法获取流;
Stream 接口的静态方法 of 可以获取数组对应的流;
根据Collection获取流:
java.util.Collection 接口中加入了default方法 stream 用来获取流,所以其所有实现类均可获取流:
Stream中的静态方法of获取流
由于数组对象不可能添加默认方法,所以 Stream 接口中提供了静态方法 of ,使用很简单:
Stream常用方法
Stream流模型的操作很丰富,这里介绍一些常用的API。这些方法可以被分成两种:
终结方法:返回值类型不再是 Stream 类型的方法,不再支持链式调用。本小节中,终结方法包括 count 和forEach 方法;
非终结方法:返回值类型仍然是 Stream 类型的方法,支持链式调用。(除了终结方法外,其余方法均为非终结方法);
Stream注意事项(重要)
Stream只能操作一次;
Stream方法返回的是新的流;
Stream不调用终结方法,中间的操作不会执行
Stream流的forEach方法
Stream流的count方法
Stream流提供 count 方法来统计其中的元素个数:
Stream流的filter方法
filter用于过滤数据,返回符合过滤条件的数据:
可以通过 filter 方法将一个流转换成另一个子集流。方法声明:
该接口接收一个 Predicate 函数式接口参数(可以是一个Lambda或方法引用)作为筛选条件。Stream流中的 filter 方法基本使用的代码如:
在这里通过Lambda表达式来指定了筛选的条件:姓名长度为2个字。
Stream流的limit方法
limit 方法可以对流进行截取,只取用前n个。方法签名:
Stream流的skip方法
如果希望跳过前几个元素,可以使用 skip 方法获取一个截取之后的新流:
Stream流的map方法
如果需要将流中的元素映射到另一个流中,可以使用 map 方法。方法签名:
Stream流的sorted方法
如果需要将数据排序,可以使用 sorted 方法。方法签名:
sorted 方法根据元素的自然顺序排序,也可以指定比较器排序;
Stream流的distinct方法
如果需要去除重复数据,可以使用 distinct 方法。方法签名:
并没有清除,自定义类型是根据对象的hashCode和equals来去除重复元素的,重写Person类的equals()与hashCode():
Stream流的find方法
如果需要找到某些数据,可以使用 find 相关方法。方法签名:
Stream流的max和min方法
Stream流的reduce方法
Stream流中的 reduce 相关方法基本使用的代码如:
Stream流的concat方法
如果有两个流,希望合并成为一个流,那么可以使用 Stream 接口的静态方法 concat :
评论