您的位置:首页 > 编程语言 > Java开发

Java8_Stream对集合的操作

2019-04-10 09:16 357 查看

Java8中有两大最为重要的改变。第一个是 Lambda 表达式 ;另外一 个则是 Stream API(java.util.stream.*)。Stream 是 Java8 中处理集合的关键抽象概念,

一:什么是Stream?能用来做什么?。

Stream(流)是一个来自数据源的元素队列并支持聚合操作。

  • 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
  • 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
  • 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。

是用于操作数据源(集合、数组等)所生成的元素序列。它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的 Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,Stream 会隐式地在内部进行遍历,做出相应的数据转换。

集合是容器,注重的是数据和数据的存储。流是用于操作数据源而生成的元素序列,注重的是数据的计算! 从某个角度而言,Stream更像是对集合操作的一种补充。

二:流的特点。

和以前的Collection操作不同的是, Stream操作还有两个基础的特征:

  • 流式风格: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
  • 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

另外:Stream 的数据源本身可以是无限的。

三:流的分类。

1.串行流:stream()

2.并行流:parallelStream()其实就是一个并行执行的流.它通过默认的ForkJoinPool,可能提高你的多线程任务的速度.Stream 的并行操作依赖于 Java7 中引入的 Fork/Join 框架(JSR166y)来拆分任务和加速处理过程。

Java 的并行 API 演变历程基本如下:

  1. 1.0-1.4 中的 java.lang.Thread
  2. 5.0 中的 java.util.concurrent
  3. 6.0 中的 Phasers 等
  4. 7.0 中的 Fork/Join 框架
  5. 8.0 中的 Lambda

三:Stream操作的几个步骤

1.创建stream

在 Java 8 中, 集合接口有两个方法来生成流:

  • stream() − 为集合创建串行流。

  • parallelStream() − 为集合创建并行流。

其他方式如:数组,I/O channel, 产生器generator

2.中间操作

多个中间操作可以连接起来形成一个流水线,除非流水线上触发中止操作,否则中间操作不会执行任何的处理,而在中止操作时一次性全部处理,称为“惰性求值”。

3.终端操作

通过Stream()接口源码抽象方法的定义,我们可以看到,可以分成两种类型,

一种返回类型为接口本身的Stream<T>,我们称这些方法为中间操作。(可以延续流式风格调用的方法执行的操作,即不会中断流水线操作)

另外一种是返回其他对象类型的,返回接口类型的,返回其他具体类型的,我们称为终端操作。(是指返回最终的结果)

关于中间操作和终端操作具体的API,请参考jdk1.8 stream接口源码。

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: