Java8InAction学习笔记(二) - 18965050/Java8InAction GitHub Wiki

Streams

stream 是看做是集合的元素序列, 支持数据处理操作. java.util.stream.Stream是Java8中新引入的一个类, 可以让我们以流的方式操作java集合类.

Stream和Collection的区别

Collection中的元素都是已经存在的, 以内存的形式保存下来的. Stream只是定义用于计算的数据结构, 元素并没有一开始被保存下来 Stream和Collection的区别

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 等 Stream中的操作 Stream中的操作

Stream操作

  • 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操作. 比如:求最大, 最小, 求和等等

Numberic Stream

除了Stream之外, Java8还提供了IntSteam, LongStream和DoubleStream专门用于数字的处理. 比如多提供了sum(), max(),min(), count()等方法. 这些numberic stream可通过

Stream.maptoInt()
Stream.maptoLong()
Stream.maptoDouble()

获取

Stream生成方式

  • 通过Collection.stream()
  • 通过Stream.of()
  • 通过Stream.empty()创建一个空的stream
  • Arrays.stream(): 从数组中创建stream
⚠️ **GitHub.com Fallback** ⚠️