当前位置:嗨网首页>书籍在线阅读

02-简介

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

6.1 简介

在Java中, 是被流水线以串行或并行方式处理(映射、过滤、转换、归约、收集)的一系列元素。流水线则是由 lambda表达式 声明的一系列操作。流和lambda表达式都是Java 8引入的最值得关注的新特性。它们改变了我们在Java中处理大集合的方式,优化了语言本身处理这些元素的方式。

流引入了 StreamDoubleStreamIntStreamLongStream 接口, CollectorsStreamSupport 工具类,一些类函数式的接口(如 Collector ),以及一大堆分散在各个类中的方法(比如 Collection 接口中的 stream()parallelStream() 方法,或 Files 类中的 lines() 方法)。

通过本章的内容,你将学到怎样在应用中有效地使用流,但在此之前,让我们先来看看流最重要的特性。

  • 流是数据序列,不是数据结构。数据元素由流来处理,而不是存储在其中。
  • 你可以从不同的源创建流[比如集合(列表、数组等),文件和字符串],或者通过创建一个可提供流元素的类。
  • 不能访问流中的单个元素。你可以定义流的源和对其元素要应用的操作。流的操作是以函数式的方式定义的,可以在中间和结尾的操作中用lambda表达式定义要执行的动作。
  • 不能修改一个流的源。举个例子,如果你过滤了流中的某些元素,那么这实际上是在流上跳过了这些元素,而不是在流的源上。
  • 流定义了如下两类操作。
    • 中间操作: 这些操作总是用结果产生一个新流。它们能用于转换、过滤、排序流的元素。
    • 结尾操作: 这些操作处理了流的所有元素,产生一个结果或一个副产物。在它们执行之后,流就不能再使用了。
  • 一个流水线由零到多个中间操作和一个结尾操作组成。
  • 中间操作可以有如下状态。
    • 无状态: 处理流中的一个元素不会依赖流中的其他元素,比如基于条件过滤元素。
    • 有状态: 处理流中的一个元素会依赖流中的其他元素,比如排序流中的元素。
  • 惰性: 中间操作是懒执行的。在结尾操作执行之前,中间操作是不会执行的。Java能够检测到一个中间操作不在流的一个或多个元素上执行,是否会影响到最终结果。如果不影响的话,Java能避免这种执行。
  • 流可以有无限数量的元素。有些操作如 limit()findFirst() 能用于限制最终参与计算的元素。由于中间操作是懒执行的,所以无限流可以在有限的时间内完成执行。
  • 流只能用一次。如前所述,当执行了一个流的结尾操作后,就认为该流已用尽,不能再次使用。如果你需要再处理同样的数据产生不同的结果,则必须从相同的源上创建一个新的 Stream 对象。如果尝试使用一个用尽的流,则会得到一个异常。
  • 开发者可以按顺序处理流元素,如果要并行处理,那么也不需要任何额外的操作。开发者可以多次指定一个流的执行模式,但只有最后一次是有效的,因此必须小心要选择的模式。有状态的中间操作无法利用并发的所有特性。

Java 9包含的一类新流 — 反应式流 — 允许以异步方式向生产者和消费者传达信息。本章介绍创建流的方法,并使用所有的中间和结尾操作,以并行和函数式的方式来处理大集合中的数据。