首页 > 编程语言 >读Java8函数式编程笔记08_测试、调试和重构

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

时间:2023-02-02 09:24:53浏览次数:43  
标签:重构 5.3 08 测试 使用 2.1 Java8 表达式 Lambda

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类

标签:重构,5.3,08,测试,使用,2.1,Java8,表达式,Lambda
From: https://www.cnblogs.com/lying7/p/17084808.html

相关文章

  • 2018-08-31知识小结
    安装一个本地包pacman-U/path/to/package/package_name-version.pkg.tar.xz对于网络安全来讲,似乎构造数据包是一种必要的技术手段相对于nmap来说,zenmap更适合......
  • 2018-08-29知识小结
    CIDR一个ISP准备把一些C类网络分配给各个用户群,目前已经分配了三个C类网段给用户,如果没有实施CIDR技术。ISP的路由器的路由表中会有三条下连网段的路由条目,并且会把它通告......
  • 方法final参数java8感想
    今天看到Latke的demo里有final的形参,查了一下使用final参数的状态有两种:1.让接收项目的程序员知道这个变量不能修改2.这个参数不能被重新赋值java8中有一种方法引用......
  • leetcode 中等(设计):[146, 155, 208, 211, 284, 304, 307, 341, 355, 380]
    目录146.LRU缓存155.最小栈208.实现Trie(前缀树)211.添加与搜索单词-数据结构设计284.顶端迭代器304.二维区域和检索-矩阵不可变307.区域和检索-数组可修......
  • 1080
    #include<iostream>usingnamespacestd;intmain(){inta,b,c,a1,b1,c1,x=1;cin>>a>>b>>c;while(1){x++;a1=a%x;b1=b%x......
  • 1080
    #include<iostream>usingnamespacestd;intmain(){inta,b,c,a1,b1,c1,x=1;cin>>a>>b>>c;while(1){x++;a1=a%x;b1......
  • 读Java8函数式编程笔记07_设计和架构的原则
    1. SOLID原则1.1. 开发良好面向对象程序的准则1.2. Liskovsubstitution里氏替换1.3. Interfacesegregation接口隔离1.4. Singleresponsibility单一功能原则1......
  • 08-项目实战-手机号管理
    #1.依赖工具类bootstrap.py-bootstrap#2.依赖工具类pagemtion.py-分页1.创建手机号表#app-->models.pyfromdjango.dbimportmodelsclassPhone(models......
  • 08-SO加载解析过程
    1JAVA层函数调用关系本文通过分析Android 4.4版本的源码,了解linker是如何加载并链接SO文件。在阅读本文之前,读者最好阅读有关ELF的文件格式,可以阅读《ELF文件结构学习》......
  • 08Scatter散点图
    importmatplotlib.pyplotaspltimportnumpyasnpn=1024X=np.random.normal(0,1,n)Y=np.random.normal(0,1,n)T=np.arctan2(Y,X)#forcolorvalueplt.sca......