-
Java8-17-Stream 并行数据处理与性能
并行数据处理与性能
在前面三章中,我们已经看到了新的 Stream 接口可以让你以声明性方式处理数据集。我们还解释了将外部迭代换为内部迭代能够让原生Java库控制流元素的处理。这种方法让Java程序员无需显式实现优化来为数据集的处理加速。到目前为止,最重要的好处是可以对这些集合执行操作流水线,能够自动利用计算机上的多个内核。
例如,在Java 7之前,并行处理数据集合非常麻烦。第一,你得...
2019-02-27 07:48:49 |
Java
-
Java8-16-Stream 收集器 02-分区+收集器接口+自定义收集器
分区
分区的概念
分区是分组的特殊情况。
分区函数
由一个谓词(返回一个布尔值的函数)作为分类函数,它称分区函数。
分区函数返回一个布尔值,这意味着得到的分组 Map 的键类型是 Boolean,于是它最多可以分为两组—— true 是一组, false 是一组。
个人理解
因为分区函数的特殊性,将分区单独提取出来进行说明。其优点后面也会说明,在于保留了分区函数...
2019-02-27 07:48:49 |
Java
-
Java8-15-Stream 收集器 01-归约与汇总+分组
用流收集数据
我们在前一章中学到,流可以用类似于数据库的操作帮助你处理集合。
你可以把Java 8的流看作花哨又懒惰的数据集迭代器。它们支持两种类型的操作:中间操作(如 filter 或 map )和终端操作(如 count 、 findFirst 、 forEach 和 reduce )。中间操作可以链接起来,将一个流转换为另一个流。这些操作不会消耗流,其目的是建立一个流水线。与此相反...
2019-02-27 07:48:49 |
Java
-
Java8-14-Stream 数值流 构建流
数值流
我们在前面看到了可以使用 reduce 方法计算流中元素的总和。
例如,你可以像下面这样计算菜单的热量:
int calories = menu.stream()
.map(Dish::getCalories)
.reduce(0, Integer::sum);
这段代码的问题是,它有一个暗含的...
2019-02-27 07:48:49 |
Java
-
Java8-13-Stream 使用实战
付诸实战
在本节中,我们会将迄今学到的关于流的知识付诸实践。我们来看一个不同的领域:执行交易的交易员。
你的经理让你为八个查询找到答案。
找出2011年发生的所有交易,并按交易额排序(从低到高)。
交易员都在哪些不同的城市工作过?
查找所有来自于剑桥的交易员,并按姓名排序。
返回所有交易员的姓名字符串,按字母顺...
2019-02-27 07:48:49 |
Java
-
Java8-12-Stream 使用流
使用流
在上一篇的读书笔记中,我们已经看到了流让你从外部迭代转向内部迭代。
这样,你就用不着写下面这样的代码来显式地管理数据集合的迭代(外部迭代)了:
/**
* 菜单
*/
public static final List<Dish> MENU =
Arrays.asList(new Dish("pork", false, 800, Dish.Type...
2019-02-27 07:48:49 |
Java
-
Java8-11-Stream 引入流
流是什么
流是Java API的新成员,它允许你以声明的方式处理数据集合,简单来说,可以把它当作数据集的高级迭代器。
此外,流还可以透明地并行处理,你无需写任何多线程代码了。
举例说明
举个例子来说明流的好处,有一个简单的场景,要求返回低热量的菜肴名称,并按照卡路里排序,实体代码如下:
基础类
菜肴
public class Dish {
private fin...
2019-02-27 07:48:49 |
Java
-
Java8-10-行为参数化
行为参数化
在软件开发中,一个众所周知的问题就是无论你做什么,用户的需求总会改变。
举个栗子,假设要做一个帮助农场主理解库存的应用。
一开始,农场主可能想有一个在所有库存中找出所有绿色苹果的功能。
但是第二天他可能会告诉你他还想要找到所有重量大于150g的苹果。
两天后,他可能又提出找到所有绿色的并且重量大于150g的苹果。
在面对这些相似的新功能时,我们都想尽可能的减少开发量。...
2019-02-27 07:48:49 |
Java