-
Java8-21-lambda 测试调试
测试和调试
现在你的代码中已经充溢着Lambda表达式,看起来不错,也很简洁。
但是,大多数时候,我们受雇进行的程序开发工作的要求并不是编写优美的代码,而是编写正确的代码。
通常而言,好的软件工程实践一定少不了单元测试,借此保证程序的行为与预期一致。
测试用例
你编写测试用例,通过这些测试用例确保你代码中的每个组成部分都实现预期的结果。
比如,图形应用的一个简单的 Point 类...
2019-02-27 07:48:49 |
Java
-
Java8-20-lambda 设计模式
使用 Lambda 重构面向对象的设计模式
语言特性对于技术的推动
新的语言特性常常让现存的编程模式或设计黯然失色。
比如, Java 5中引入了 foreach 循环,由于它的稳健性和简洁性,已经替代了很多显式使用迭代器的情形。
Java 7中推出的菱形操作符(<>)让大家在创建实例时无需显式使用泛型,一定程度上推动了Java程序员们采用类型接口(type interf...
2019-02-27 07:48:49 |
Java
-
Java8-19-lambda 重构代码
重构、测试和调试
通过本书的前七章,我们了解了Lambda和Stream API的强大威力。
你可能主要在新项目的代码中使用这些特性。如果你创建的是全新的Java项目,这是极好的时机,你可以轻装上阵,迅速地将新特性应用到项目中。然而不幸的是,大多数情况下你没有机会从头开始一个全新的项目。很多时候,你不得不面对的是用老版Java接口编写的遗留代码。
这些就是本章要讨论的内容。我们会介绍几...
2019-02-27 07:48:49 |
Java
-
Java8-18-Stream Spliterator
Spliterator
简介
Spliterator 是Java 8中加入的另一个新接口;这个名字代表“可分迭代器”(splitableiterator)。
和 Iterator 一样,Spliterator 也用于遍历数据源中的元素,但它是为了并行执行而设计的。
虽然在实践中可能用不着自己开发 Spliterator ,但了解一下它的实现方式会让你对并行流的工作原理有更深入的了解。...
2019-02-27 07:48:49 |
Java
-
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