《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应用于当前流中所有元素所产生的结果连接到一起而获得的。(注意,这里的每个结果都是一个流。)
相关文章
|
11天前
|
NoSQL Java 数据库连接
深入探索 Java 后台开发的核心技术
【4月更文挑战第5天】本文探讨了Java后台开发的关键技术,包括Spring框架与Spring Boot的使用,MyBatis和Hibernate的ORM选择,关系型与NoSQL数据库的适用场景,线程池与异步处理在并发中的作用,微服务架构及RESTful API设计。这些核心技术有助于开发者打造稳定、高性能的Java后台系统,适应不断发展的云计算和人工智能需求。
|
5天前
|
Java
Java中ReentrantLock中tryLock()方法加锁分析
Java中ReentrantLock中tryLock()方法加锁分析
8 0
|
26天前
|
Java
java中日期处理的一些工具方法
java中日期处理的一些工具方法
16 1
|
4天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
10 0
|
4天前
|
存储 算法 安全
Java Map:键值对的奇妙之旅
Java Map:键值对的奇妙之旅
26 0
Java Map:键值对的奇妙之旅
|
5天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
21 9
|
14天前
|
Java
Java通过反射获取类调用方法
Java通过反射获取类调用方法
17 0
|
25天前
|
Java
java面向对象高级分层实例_测试类(main方法所在的类)
java面向对象高级分层实例_测试类(main方法所在的类)
8 1
|
25天前
|
Java API Maven
email api java编辑方法?一文教你学会配置步骤
在Java开发中,Email API是简化邮件功能的关键工具。本文指导如何配置和使用Email API Java:首先,在项目中添加javax.mail-api和javax.mail依赖;接着,配置SMTP服务器和端口;然后,创建邮件,设定收件人、发件人、主题和正文;最后,使用Transport.send()发送邮件。借助Email API Java,可为应用添加高效邮件功能。
|
25天前
|
Java
【Java】重写compareTo()方法给对象数组排序
【Java】重写compareTo()方法给对象数组排序
9 0