读Java8函数式编程笔记08_测试、调试和重构

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1. Lambda表达式的单元测试

1.1. 单元测试是测试一段代码的行为是否符合预期的方式

1.2. Lambda表达式没有名字,无法直接在测试代码中调用

1.2.1. 将Lambda表达式放入一个方法测试,这种方式要测那个方法,而不是Lambda表达式本身

1.2.2. 请用方法引用。任何Lambda表达式都能被改写为普通方法,然后使用方法引用直接引用

1.2.2.1. 想要对复杂一点的Lambda表达式编写单元测试,将其抽取成一个常规的方法

2. 在测试替身时使用Lambda表达式

2.1. 使用测试替身描述系统中其他模块的期望行为

2.1.1. 测试替身也常被称为模拟

2.1.2. 测试存根和模拟都属于测试替身

2.1.2.1. 区别是模拟可以验证代码的行为

2.2. 使用Lambda表达式的最简单方式是实现轻量级的测试存根

2.3. Mockito框架有助于更容易地产生测试替身

2.3.1. Mockito使用Answer接口允许用户提供其他行为

2.3.2. Answer本身就是一个函数接口

2.3.2.1. 代码即数据

3. 惰性求值和调试

3.1. 因为迭代已交由类库控制,而且很多流操作是惰性求值的,所以使用流时,调试可能会变得更加复杂

4. 日志和打印消息

4.1. peek方法

4.1.1. 让你能查看每个值,同时能继续操作流

4.1.1.1. 能记录中间值,在调试时非常有用

4.1.2. 包含一个空的方法体,只要能设置断点就行

4.1.2.1. 将值简单地映射为其本身,就有地方设置断点了

5. 重构候选项

5.1. 使用流操作替代for循环

5.2. 封装局部状态

5.2.1. 比如日志的级别,isDebugEnabled方法暴露了内部状态

5.2.2. 使用Lambda表达式,外面的代码根本不需要检查日志级别

5.3. 使用继承只是为了覆盖一个方法

5.3.1. 鼓励重用和组合

5.3.2. 代码短小精悍就是个优势

5.3.3. 在Java 8以前,这并不是一个反模式,而是惯用的代码编写方式

5.3.3.1. 就像使用匿名内部类传递行为一样,都不是反模式,而是在Java中表达你所想的唯一方式

5.4. 不要重复你劳动(Don't Repeat Yourself, DRY)

5.4.1. 有时,重复是唯一可以避免系统过紧耦合的方式

5.4.1.1. 同样的东西写两遍(Write Everything Twice, WET)

5.4.2. 如果有一个整体上大概相似的模式,只是行为上有所不同,就可以试着加入一个Lambda表达式

5.5. 随着语言的演进,编程习惯也要与时俱进

6. 使用Lambda表达式的方式

6.1. 更好的集合类代码

6.1.1. 使用新的Stream和Collector

6.2. 数据并行处理

6.3. 更简洁干净的代码

6.4. 并发

6.4.1. 使用RxJava中新的并发特性

6.4.2. 使用CompletableFuture类

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java