《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.7.4 用f?latMap来构建Optional值的函数

1.7.4 用f?latMap来构建Optional值的函数

假设你有一个可以产生Optional对象的方法f,并且目标类型T具有一个可以产生Optional对象的方法g。如果它们都是普通的方法,那么你可以通过调用s.f().g()来将它们组合起来。但是这种组合没法工作,因为s.f()的类型为Optional,而不是T。因此,需要调用:

如果s.f()的值存在,那么g就可以应用到它上面。否则,就会返回一个空Optional
很明显,如果有更多的可以产生Optional值的方法或Lambda表达式,那么就可以重复此过程。你可以直接将对f?latMap的调用链接起来,从而构建由这些步骤构成的管道,只有所有步骤都成功时,该管道才会成功。
例如,考虑前一节中安全的inverse方法。假设我们还有一个安全的平方根:

那么你可以像下面这样计算倒数的平方根了:

或者,你可以选择下面的方式:

无论是inverse方法还是squareRoot方法返回Optional.empty(),整个结果都会为空。
注意:你已经在Stream接口中看到过f?latMap方法(参见1.3节),当时这个方法被用来将可以产生流的两个方法组合起来,其实现方式是摊平由流构成的流。如果将可选值当作尺寸为0和1的流来解释,那么Optional.f?latMap方法与其操作方式一样。
程序清单1-3中的示例程序演示了Optional API的使用方式。
程序清单1-3 optional/OptionalTest.java

java.util.Optional 8
Optional flatMap(Function< super T,Optional> mapper)
产生将mapper应用于当前的Optional值所产生的结果,或者在当前Optional为空时,返回一个空Optional。

时间: 2024-12-30 20:17:09

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.7.4 用f?latMap来构建Optional值的函数的相关文章

《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核心技术 卷Ⅱ 高级特性(原书第10版)》一1.10 群组和分区

1.10 群组和分区 在上一节中,你看到了如何收集给定国家的所有语言,但是其处理显得有些冗长.你必须为每个映射表的值都生成单例集,然后指定如何将现有集与新集合并.将具有相同特性的值群聚成组是非常常见的,并且groupingBy方法直接就支持它. 让我们来看看通过国家来群组Locale的问题.首先,构建该映射表: 注意:快速复习一下地点:每个Locale都有一个语言代码(例如英语的en)和一个国家代码(例如美国的US).Locale en_US描述的是美国英语,而en_IE是爱尔兰英语.某些国家有

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.3 filter、map和flatMap方法

1.3 filter.map和flatMap方法 流的转换会产生一个新的流,它的元素派生自另一个流中的元素.我们已经看到了f?ilter转换会产生一个流,它的元素与某种条件相匹配.下面,我们将一个字符串流转换为了只包含长单词的另一个流: f?ilter的引元是Predicate,即从T到boolean的函数. 通常,我们想要按照某种方式来转换流中的值,此时,可以使用map方法并传递执行该转换的函数.例如,我们可以像下面这样将所有单词都转换为小写: 这里,我们使用的是带有方法引用的map,但是,通

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.7.2 不适合使用Optional值的方式

1.7.2 不适合使用Optional值的方式 如果没有正确地使用Optional值,那么相比较以往的得到"某物或null"的方式,你并没有得到任何好处. get方法会在Optional值存在的情况下获得其中包装的元素,或者在不存在的情况下抛出一个NoSuchElementException对象.因此, java.util.Optional 8 T get() 产生这个Optional的值,或者在该Optional为空时,抛出一个NoSuchElement Exception对象. b

《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一1.7.3 创建Optional值

1.7.3 创建Optional值 到目前为止,我们已经讨论了如何使用其他人创建的Optional对象.如果想要编写方法来创建Optional对象,那么有多个方法可以用于此目的,包括Optional.of(result)和Optional.empty().例如, ofNullable方法被用来作为可能出现的null值和可选值之间的桥梁.Optional.ofNullable(obj)会在obj不为null的情况下返回Optional.of(obj),否则会返回Optional.empty().

《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的全部特性,所以我们