《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.1 从迭代到流的操作

1.1 从迭代到流的操作

在处理集合时,我们通常会迭代遍历它的元素,并在每个元素上执行某项操作。例如,假设我们想要对某本书中的所有长单词进行计数。首先,将所有单词放到一个列表中:

现在,我们可以迭代它了:

在使用流时,相同的操作看起来像下面这样:

流的版本比循环版本要更易于阅读,因为我们不必扫描整个代码去查找过滤和计数操作,方法名就可以直接告诉我们其代码意欲何为。而且,循环需要非常详细地指定操作的顺序,而流却能够以其想要的任何方式来调度这些操作,只要结果是正确的即可。
仅将stream修改为parallelStream就可以让流库以并行方式来执行过滤和计数。

流遵循了“做什么而非怎么做”的原则。在流的示例中,我们描述了需要做什么:获取长单词,并对它们计数。我们没有指定该操作应该以什么顺序或者在哪个线程中执行。相比之下,本节开头处的循环要确切地指定计算应该如何工作,因此也就丧失了进行优化的
机会。
流表面上看起来和集合很类似,都可以让我们转换和获取数据。但是,它们之间存在着显著的差异:
1. 流并不存储其元素。这些元素可能存储在底层的集合中,或者是按需生成的。
2. 流的操作不会修改其数据源。例如,f?ilter方法不会从新的流中移除元素,而是会生成一个新的流,其中不包含被过滤掉的元素。
3. 流的操作是尽可能惰性执行的。这意味着直至需要其结果时,操作才会执行。例如,如果我们只想查找前5个长单词而不是所有长单词,那么f?ilter方法就会在匹配到第5个单词后停止过滤。因此,我们甚至可以操作无限流。
让我们再来看看这个示例。stream和parallelStream方法会产生一个用于words列表的stream。f?ilter方法会返回另一个流,其中只包含长度大于12的单词。count方法会将这个流化简为一个结果。
这个工作流是操作流时的典型流程。我们建立了一个包含三个阶段的操作管道:
1.?创建一个流。
2.?指定将初始流转换为其他流的中间操作,可能包含多个步骤。
3.?应用终止操作,从而产生结果。这个操作会强制执行之前的惰性操作。从此之后,这个流就再也不能用了。
在程序清单1-1中的示例中,流是用stream或parallelStream方法创建的。f?ilter方法对其进行转换,而count方法是终止操作。
程序清单1-1 streams/CountLongWords.java


在下一节中,你将会看到如何创建流。后续的三个小节将处理流的转换。再后面的五个小节将讨论终止操作。
java.util.stream.Stream 8

  • Stream filter(Predicate<?super T> p)
    产生一个流,其中包含当前流中满足P的所有元素。
  • long count()
    产生当前流中元素的数量。这是一个终止操作。
    java.util.Collection 1.2
  • default Stream stream()
  • default Stream parallelStream()
    产生当前集合中所有元素的顺序流或并行流。
时间: 2024-11-02 11:18:57

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.1 从迭代到流的操作的相关文章

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.12 约简操作

1.12 约简操作 reduce方法是一种用于从流中计算某个值的通用机制,其最简单的形式将接受一个二元函数,并从前两个元素开始持续应用它.如果该函数是求和函数,那么就很容易解释这种机制: 在上面的情况中,reduce方法会计算v0+v1+v2+-,其中vi是流中的元素.如果流为空,那么该方法会返回一个Optional,因为没有任何有效的结果. 注意:在上面的情况中,可以写成reduce(Integer::sum)而不是reduce((x, y) -> x+y). 通常,如果reduce方法有一项

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.2 流的创建

1.2 流的创建 你已经看到了可以用Collection接口的stream方法将任何集合转换为一个流.如果你有一个数组,那么可以使用静态的Stream.of方法. of方法具有可变长参数,因此我们可以构建具有任意数量引元的流: 使用Array.stream(array, from, to)可以从数组中位于from(包括)和to(不包括)的元素中创建一个流. 为了创建不包含任何元素的流,可以使用静态的Stream.empty方法: Stream接口有两个用于创建无限流的静态方法.generate方

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.6 流机制解析器

3.6 流机制解析器 DOM解析器会完整地读入XML文档,然后将其转换成一个树形的数据结构.对于大多数应用,DOM都运行得很好.但是,如果文档很大,并且处理算法又非常简单,可以在运行时解析节点,而不必看到完整的树形结构,那么DOM可能就会显得效率低下了.在这种情况下,我们应该使用流机制解析器(streaming parser). 在下面的小节中,我们将讨论Java类库提供的流机制解析器:老而弥坚的SAX解析器和添加到Java SE 6中的更现代化的StAX解析器.SAX解析器使用的是事件回调(e

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一导读

前 言 致读者 本书是按照Java SE 8完全更新后的<Java核心技术 卷Ⅱ 高级特性(原书第10版)>.卷Ⅰ主要介绍了Java语言的一些关键特性:而本卷主要介绍编程人员进行专业软件开发时需要了解的高级主题.因此,与本书卷Ⅰ和之前的版本一样,我们仍将本书定位于用Java技术进行实际项目开发的编程人员. 编写任何一本书籍都难免会有一些错误或不准确的地方.我们非常乐意听到读者的意见.当然,我们更希望对本书问题的报告只听到一次.为此,我们创建了一个FAQ.bug修正以及应急方案的网站http:/

Java核心技术 卷Ⅰ 基础知识(原书第10版)

Java核心技术系列 Java核心技术 卷Ⅰ 基础知识 (原书第10版) Core Java Volume I-Fundamentals (10th Edition) [美] 凯S.霍斯特曼(Cay S. Horstmann) 著 周立新 陈 波 叶乃文 邝劲筠 杜永萍 译 图书在版编目(CIP)数据 Java核心技术 卷Ⅰ 基础知识(原书第10版) / (美)凯S. 霍斯特曼(Cay S. Horstmann)著:周立新等译. -北京:机械工业出版社,2016.8 (Java核心技术系列) 书

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一第3章 XML

第3章 XML ▲ XML概述 ▲ 使用命名空间 ▲ 解析XML文档 ▲ 流机制解析器 ▲ 验证XML文档 ▲ 生成XML文档 ▲ 使用XPath来定位信息 ▲ XSL转换 Don Box等人在其合著的<Essential XML>(Addison-Wesley出版社2000年出版)的前言中半开玩笑地说道:"可扩展标记语言(Extensible Markup Language,XML)已经取代了Java.设计模式.对象技术,成为软件行业解决世界饥荒的方案."确实,正如你将在

《Java语言导学(原书第6版)》一导读

前 言 自2010年年初Oracle公司收购Sun公司以来,Java语言迎来激动人心的时代.正如Java Community Process计划的活动所印证的,Java语言将不断发展.本书基于Java SE 8(Java Platform Standard Edition 8)并引用其API. 相比本书第5版(针对的是Java版本7),第6版有一些新特点: Lambda表达式使得功能可作为方法参数使用,代码作为数据使用.Lambda表达式描述单个方法接口(也称为功能接口)的实例会更简洁.4.4.

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.8 XSL转换

3.8 XSL转换 XSL转换(XSLT)机制可以指定将XML文档转换为其他格式的规则,例如,转换为纯文本.XHTML或任何其他的XML格式.XSLT通常用来将某种机器可读的XML格式转译为另一种机器可读的XML格式,或者将XML转译为适于人类阅读的表示格式. 你需要提供XSLT样式表,它描述了XML文档向某种其他格式转换的规则.XSLT处理器将读入XML文档和这个样式表,并产生所要的输出(参见图3-7). XSLT规范很复杂,已经有很多书描述了该主题.我们不可能讨论XSLT的全部特性,所以我们

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.6.1 使用SAX解析器

3.6.1 使用SAX解析器 SAX解析器在解析XML输入数据的各个组成部分时会报告事件,但不会以任何方式存储文档,而是由事件处理器建立相应的数据结构.实际上,DOM解析器是在SAX解析器的基础上构建的,它在接收到解析器事件时构建DOM树. 在使用SAX解析器时,需要一个处理器来为各种解析器事件定义事件动作.ContentHandler接口定义了若干个在解析文档时解析器会调用的回调方法.下面是最重要的几个: startElement和endElement在每当遇到起始或终止标签时调用. char