Java8InAction学习笔记(二) - 18965050/Java8InAction GitHub Wiki
stream 是看做是集合的元素序列, 支持数据处理操作. java.util.stream.Stream是Java8中新引入的一个类, 可以让我们以流的方式操作java集合类.
Collection中的元素都是已经存在的, 以内存的形式保存下来的.
Stream只是定义用于计算的数据结构, 元素并没有一开始被保存下来

Stream只能遍历一次, 如下的代码:
Stream s=strList.stream();
s.forEach(System.out:println); #成功
s.forEach(System.out:println); #失败, 报IllegalStateException
Collection使用的是显示的迭代, Stream使用的是隐式的迭代
Stream中的操作可被分为:
-
中间操作(intermediate operations): filter, map, limit等. 中间操作是懒加载的, 会等到终结操作执行时才开始执行. 这是由于中间操作会存在合并,过滤等情况 比如下面的代码:

输出为:
filtering pork mapping pork filtering beef mapping beef filtering chicken mapping chicken [pork, beef, chicken] -
终结操作(terminal operations): collect,count 等

- filter: 参数为Predicate 函数接口
- distinct: 去重
- limit: 限制结果个数
- skip: 忽略开头的元素.
- map: 元素转换
- flatMap: 参数为Stream, 用于集合,数组等拍平转换
//获取集合中去重的字符 List<String> res2List=words.stream() .map(word -> word.split("")) .flatMap(Arrays::stream) .distinct() .collect(toList()); - anyMatch/allMatch: 只要有一个匹配/所有匹配/没有一个匹配. 内部判断使用的是短路运算符
- findFirst/findAny: 查询第一个/查询任意一个
这两个方法返回的是Optional对象.Optional是Java8中新增的一个类, 代表的是值可由可无.
Optional方法说明:
- isPresent(): 有值返回true, 否则返回false
- ifPresent(Consumer block): 有值进行consumer操作, 无值不操作
- get(): 有值返回, 无值抛出NoSuchElementException
- orElse(T): 有值返回实际值, 无值返回默认值
- reduce: 进行reduce操作. 比如:求最大, 最小, 求和等等
除了Stream之外, Java8还提供了IntSteam, LongStream和DoubleStream专门用于数字的处理. 比如多提供了sum(), max(),min(), count()等方法. 这些numberic stream可通过
Stream.maptoInt()
Stream.maptoLong()
Stream.maptoDouble()
获取
- 通过Collection.stream()
- 通过Stream.of()
- 通过Stream.empty()创建一个空的stream
- Arrays.stream(): 从数组中创建stream