转载

Java8函数式编程之Stream概述

本文,我们开始进入到Java8的Stream流编程概念及实际使用方式的学习。

什么是流(Stream)?

Stream流是jdk1.8引入的新成员,通过声明式的方式处理集合数据(多通过lambda表达式方式进行展示)

它能够将基础操作链接起来,从而完成复杂的数据处理流水线

它也为开发者提供了透明的并行处理

《Java8实战》一书的解释为

流,是从支持 数据处理操作 的 源 生成的元素序列

流与集合的区别

  1. 时间与空间的区别

集合是静态的概念,流是动态的概念。eg: DVD碟片是集合,播放中的一段视频是流集合面向的是存储,而流面向的计算

eg: 构造一个质数集合,这是做不到的,因为这个集合是无穷的 但是构造一个质数流是可以的,我们只需要不断的构造就可以了。

也就是说,集合在时间维度看是无穷的,而流在时间维度上看是有穷的。
  1. 集合可以遍历多次,但流只能遍历一次

流是动态概念,遍历之后就不存在了,再次遍历会出现异常

  1. 集合的迭代是外部迭代,如:foreach ; 流的迭代是内部迭代,我们只需要定义操作,流会帮我们在内部进行迭代操作

流的组成

流由

数据源          中间操作(业务处理)               终端操作(将结果进行收集) 组成

如:           cart(SkuList)    ->     [filter -> sorted -> map]  ->    collect

流操作的分类

  1. 中间操作

    1.1 无状态操作

    (不需要建立在所有的数据上,只需要针对单个数据进行判断即可): filter、map、peek等,  具有局部性

    1.2 有状态操作

    (需要针对所有数据基础上): distinct、sorted、limit等,具有全局性
  2. 终端操作

    1.1 非短路操作

    (所有数据均执行): forEach、collect、count等

    1.2 短路操作

    (只要找到符合要求的就不需要继续执行了):anyMatch、findFirst、findAny

流的使用

这里我们对常见的流的使用方法进行详细分类,承接上方 流操作的分类

  1. 中间操作(无状态)

    过滤      filter
    映射      map
    扁平化    flatMap
    遍历      peek
  2. 中间操作(有状态)

    去重     distinct
    跳过     skip
    截断     limit
    排序     sorted
  3. 终端操作(非短路)

    遍历       forEach
    规约       reduce
    最大值     max
    聚合       collect
    最小值     min
    计数       count
  4. 终端操作(短路)

    所有匹配    allMatch
    任意匹配    anyMatch
    不匹配      noneMatch
    查找首个    findFirst
    查找任意    findAny

接下来,我们通过代码实例,挨个讲解一下这些方法的使用

版权声明:

原创不易,洗文可耻。除非注明,本博文章均为原创,转载请以链接形式标明本文地址。

原文  http://wuwenliang.net/2020/05/17/Java8函数式编程之Stream概述/
正文到此结束
Loading...