Java 8——函数式数据处理(流)

本篇内容大部分来自《Java 8实战》

流是什么?

流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时写一个实现)。

就现在来说,你可以把它们看成遍历数据集合的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码!

下面两段代码都是用来返回低热量的菜肴名称的,并按照卡路里排序,一个使用java 7写的,另一个是用java 8的流写的,比较一下,不用太关心java 8的语法:

现在,你可以看出,从软件工程师的角度来看,新的方法有几个显而易见的好处。

  • 代码是以声明性方式写的:说明想要完成什么(筛选热量低的菜肴)而不是说明如何实现一个操作(利用循环和if条件等控制流语句)。这种方法加上行为参数化让你可以轻松应对变化的需求:你很容易创建一个代码版本,利用Lambda表达式来筛选高卡路里的菜肴,而用不着去复制粘贴代码。
  • 你可以把几个基础操作链接起来,来表达复杂的数据处理流水线(在filter后面接上sorted、map和collect操作),同时保持代码清晰可读。

因为filter、sorted、map和coleect等操作是与具体线程模型无关的高层次构件,所以它们的内部实现可以是单线程的,也可能透明地充分利用你的多核架构!在实践中,这意味着你用不着为了让某些数据处理任务并行而去操心线程和锁了,Steam API都替你做好了!

并且新的Steam APi表达能力非常强,能写出例如下面这样的代码:

Map<Dish.Type, List<Dish>> dishesByType = 
        menu.steam().collect(groupingBy(Dish::getType));

流简介

要讨论流,就要先来讨论集合,这是最容易上手的方式了。Java 8中的集合支持一个新的stream方法,它会返回一个流(接口定义在java.util,steam.Steam里)。

那么,流到底是什么呢?简短的定义就是“从支持数据处理操作的源,生成的元素序列”。Oh,听上去就让人头大。让我们一步步来剖析这个定义:

让我们来看一段能够体现所有这些概念的代码:

在本例中,我们先是对menu调用steam方法,由菜单得到一个流。数据源是菜肴列表(菜单),它给流提供一个元素序列。接下来,对流应用一系列数据处理操作:filter、map、limit和collect。

除了collect之外,所有这些操作都会返回另一个流,这样它们就可以竭诚一条流水线,于是就可以看作对源的一个查询。最后,collect操作开始处理流水线,并返回结果。下图展示了该流操作的每个操作的简介:

感觉像不像变魔术呢?不过至少看起来,是挺酷的。

集合与流

上图很好的说明了在Java 8中的集合与流的关系,集合就像是DVD一样,保存了完整的数据结构和所有的值,而流则像是现在视频网站中的视频那样,不必提前下好完整的视频,只需要提前下载好用户播放位置的那几帧就好了。

请注意:流和迭代器一样,都只能遍历一次。

流操作

java.util.steam.Steam中的Steam接口定义了许多操作。它们可以分为两大类,一类是中间操作,另一类是终端操作

为了方便,下面总结了一些Steam API提供的操作:

流的使用一般包括三件事:

  • 一个数据源(如集合)来执行一个查询;
  • 一个中间操作链,形成一条流的流水线;
  • 一个终端操作,执行流水线,并能生成结果

流的流水线背后的理念有点类似于构建器模式。

至此,流的基本操作就已经阐述完全了,相信你已经同我一样对Java 8的新特性感到兴奋了吧,不可避免,因为这实在是太酷啦!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏我杨某人的青春满是悔恨

人生充满选择,编程也是

人生在世,我们每天都需要进行三项重大选择:早餐吃什么,午餐吃什么,晚餐吃什么。这一度让我感到非常为难,于是我养成了一个习惯,只要在附近的餐馆发现了几种还不错的食...

1011
来自专栏IMWeb前端团队

写给前端专家的一封公开信:关于分号(翻译)

本文作者:IMWeb frankfang 原文出处:IMWeb社区 未经同意,禁止转载 原文 Sean Silva 给我发来一封信: 我最近在浏览你...

1937
来自专栏编程

厉害!14张思维导图读懂 Python 编程核心知识体系

本文主要涵盖了 Python 编程的核心知识(暂不包括标准库及第三方库,后续会发布相应专题的文章)。 首先,按顺序依次展示了以下内容的一系列思维导图:基础知识,...

2875
来自专栏微信公众号:Java团长

开发中我们需要遵循的几个设计原则!

在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义。本文主要将总结这些常见的原则和具体阐...

1031
来自专栏腾讯移动品质中心TMQ的专栏

小说书架内容质量自动化测试

一.项目背景 小说书架的产品思路是:在手机QQ浏览器这个平台上,给用户提供一个小说书架这样的小说阅读入口。通过这个入口阅读到的小说,是后台将从其它网页中抽取到...

2435
来自专栏同步博客

设计模式六大原则

  单一职责原则又称为单一功能原则,即不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。

824
来自专栏Java后端技术栈

开发中我们需要遵循的几个设计原则!

在软件开发中,前人对软件系统的设计和开发总结了一些原则和模式, 不管用什么语言做开发,都将对我们系统设计和开发提供指导意义。本文主要将总结这些常见的原则和具体阐...

992
来自专栏spring源码深度学习

java核心技术——Exception和Error的区别

Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者...

1741
来自专栏韩伟的专栏

面向对象的代码风格(上)

大家过年好呀!公众号从今天开始恢复更新,感谢大家不离不弃的关注。 今天的文末有投票,以助于我在新的一年里将公众号做得更好,踊跃参加一下吧! 本篇文章分两章发送,...

4048
来自专栏码农阿宇

设计模式快速学习(一)

UML类图 ? 简单工厂模式 1.1类图 ? 策略模式 2.1策略模式结构图 ? 2.2策略模式解析 策略模式时一种定义一系列算法的方法,从概念上看,所有这...

2593

扫码关注云+社区

领取腾讯云代金券