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和Collector6.2.数据并行处理6.3.更简洁干净的代码6.4.并发6.4.1.使用RxJava中新的并发特性6.4.2.使用CompletableFuture类