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

简介: 本节书摘来华章计算机《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一书中的第1章 ,第1.3节,[美] 凯S.霍斯特曼(Cay S. Horstmann) 著陈昊鹏 译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.3 filter、map和flatMap方法

流的转换会产生一个新的流,它的元素派生自另一个流中的元素。我们已经看到了f?ilter转换会产生一个流,它的元素与某种条件相匹配。下面,我们将一个字符串流转换为了只包含长单词的另一个流:
image

f?ilter的引元是Predicate,即从T到boolean的函数。
通常,我们想要按照某种方式来转换流中的值,此时,可以使用map方法并传递执行该转换的函数。例如,我们可以像下面这样将所有单词都转换为小写:
image

这里,我们使用的是带有方法引用的map,但是,通常我们可以使用lambda表达式来代替:
image

上面语句所产生的流中包含了所有单词的首字母。
在使用map时,会有一个函数应用到每个元素上,并且其结果是包含了应用该函数后所产生的所有结果的流。现在,假设我们有一个函数,它返回的不是一个值,而是一个包含众多值的流:
image

例如,letters("boat")的返回值是流["b", "o", "a", "t"]。

注意:通过使用1.13节中的IntStream.range方法,我们实现这个方法可以优雅得多。

假设我们在一个字符串流上映射letters方法:
image

那么就会得到一个包含流的流,就像[...["y","o","u","r"],["b","o","a","t"],...]。为了将其摊平为字母流[..."y","o","u","r","b","o","a","t",...],可以使用f?latMap方法而不是map方法:
image

注意:在流之外的类中你也会发现f?latMap方法,因为它是计算机科学中的一种通用概念。假设我们有一个泛型G(例如Stream),以及将某种类型T转换为G<U>的函数f和将类型U转换为G<V>的函数g。然后,我们可以通过使用f?latMap来组合它们,即首先应用f,然后应用g。这是单子论的关键概念。但是不必担心,我们无须了解任何有关单子的知识就可以使用f?latMap。

java.util.stream.Stream 8

  • Stream f?ilter(Predicate<? super T> predicate)
    产生一个流,它包含当前流中所有满足断言条件的元素。
  • Stream map(Function<? super T,? extends R> mapper)
    产生一个流,它包含将mapper应用于当前流中所有元素所产生的结果。
  • Stream f?latMap(Function<? super T,? extends Stream<? extends R>> mapper)
    产生一个流,它是通过将mapper应用于当前流中所有元素所产生的结果连接到一起而获得的。(注意,这里的每个结果都是一个流。)
相关文章
|
3天前
|
安全 算法 Java
Java Collections工具类:常用方法与技巧
Java Collections工具类:常用方法与技巧
|
3天前
|
存储 安全 Java
Java Map接口及其常用实现类详解
Java Map接口及其常用实现类详解
|
3天前
|
JSON 缓存 安全
Java反序列化漏洞自动挖掘方法
Java反序列化漏洞自动挖掘方法
10 0
|
4天前
|
人工智能 文字识别 Java
AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提取方法分享)
【2月更文挑战第1天】Lept4J和Tess4J都是基于Tesseract OCR引擎的Java接口,可以用来识别图像中的文本,本次介绍Tess4J
33 0
|
5天前
|
存储 Java
深入剖析 Java 类属性与类方法的应用
Java 类属性,也称为字段,是类中的变量。它们用于存储与类相关的数据。 创建类属性 在类定义中声明属性
37 0
|
5天前
|
Java
Java字符串转整数的超简单方法!
Java字符串转整数的超简单方法!
18 0
|
8天前
|
Java
深入了解 Java 方法和参数的使用方法
方法是一块仅在调用时运行的代码。您可以将数据(称为参数)传递到方法中。方法用于执行特定的操作,它们也被称为函数。
61 4
|
18天前
|
存储 Java
java Map集合相关介绍和方法使用操作
java Map集合相关介绍和方法使用操作
17 2
|
18天前
|
存储 Java
java set集合相关介绍和方法使用操作
java set集合相关介绍和方法使用操作
13 2
|
18天前
|
存储 Java 索引
java list集合相关介绍和方法使用操作
java list集合相关介绍和方法使用操作
12 1