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

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类
读Java8函数式编程笔记08_测试、调试和重构的更多相关文章
- Java8函数式编程探秘
引子 将行为作为数据传递 怎样在一行代码里同时计算一个列表的和.最大值.最小值.平均值.元素个数.奇偶分组.指数.排序呢? 答案是思维反转!将行为作为数据传递. 文艺青年的代码如下所示: public ...
- [2017.02.23] Java8 函数式编程
以前学过Haskell,前几天又复习了其中的部分内容. 函数式编程与命令式编程有着不一样的地方,函数式编程中函数是第一等公民,通过使用少量的几个数据结构如list.map.set,以及在这些数据结构上 ...
- 关于Java8函数式编程你需要了解的几点
函数式编程与面向对象的设计方法在思路和手段上都各有千秋,在这里,我将简要介绍一下函数式编程与面向对象相比的一些特点和差异. 函数作为一等公民 在理解函数作为一等公民这句话时,让我们先来看一下一种非常常 ...
- Java8 函数式编程详解
Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...
- 漫漫人生路,学点Jakarta基础-Java8函数式编程
接口默认方法 Java8版本以后新增了接口的默认方法,不仅仅只能包含抽象方法,接口也可以包含若干个实例方法.在接口内定义实例方法(但是注意需要使用default关键字) 在此定义的方法并非抽象方法,而 ...
- Java8函数式编程以及Lambda表达式
第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...
- [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...
- java8函数式编程(转载)
1. 概述 1.1 函数式编程简介 我们最常用的面向对象编程(Java)属于命令式编程(Imperative Programming)这种编程范式.常见的编程范式还有逻辑式编程(Logic Progr ...
- Java8函数式编程的宏观总结
1.java8优势通过将行为进行抽象,java8提供了批量处理数据的并行类库,使得代码可以在多核CPU上高效运行. 2.函数式编程的核心使用不可变值和函数,函数对一个值进行处理,映射成另一个值. 3. ...
- java8函数式编程实例
什么是函数式编程 函数式编程是java8的一大特色,也就是将函数作为一个参数传递给指定方法.别人传的要么是基本数据类型,要么就是地址引用 ,我们要穿一个“动作”. Stream 说到函数式编程,就不得 ...
随机推荐
- letcode刷题记录-day02-回文数
回文数 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答 ...
- 抓包分析 TCP 握手和挥手
前言 首先需要明确的是 TCP 是一个可靠传输协议,它的所有特点最终都是为了这个可靠传输服务.在网上看到过很多文章讲 TCP 连接的三次握手和断开连接的四次挥手,但是都太过于理论,看完感觉总是似懂非懂 ...
- Linux环境下执行脚本重启Weblogic控制台中部署的应用程序
之前有写过一篇博文介绍切换登录方式的脚本,脚本中存在一个缺点:仍需手动去Weblogic控制台重启应用程序:本文即介绍如何在脚本中更新Weblogic控制台中部署的应用程序. 一.配置Weblogic ...
- 云原生之旅 - 10)手把手教你安装 Jenkins on Kubernetes
前言 谈到持续集成工具就离不开众所周知的Jenkins,本文带你了解如何在 Kubernetes 上安装 Jenkins,后续文章会带你深入了解如何使用k8s pod 作为 Jenkins的build ...
- 2022春每日一题:Day 36
题目:[JLOI2013]删除物品 直接做显然比较复杂,这个题是说对顶栈,但是可以把两个栈拼在一起,记录一下栈顶的下标,然后这样这题就可以转化为线性上的操作查询了,用树状数组简单维护一下就ok了(某个 ...
- halcon如何识别硬币?
halcon如何识别硬币? 前言 最近一直在学习halcon,在此做了一个案例,分享给大家,效果图如下: 1.思路分析 通过观察,发现1元,5角,1角,它们在面值的文字描述不一样,硬币显示的花纹不一样 ...
- 移动 VR 开发时要避免的 PC 渲染技术
更新:本文是为 Quest 1 开发人员编写的.虽然 Quest 2 建立在相同的架构上,但现在更容易为阴影贴图(以及其他需要从先前渲染过程中生成的纹理读取的简单技术)做预算. 尽管移动芯片组可以支持 ...
- 3.8:使用R语言实现Apriori算法示例
〇.目标 1.使用R语言实现Apriori算法完成关联规则挖掘:2.利用超市购物篮Groceries数据进行关联规则分析. 一.利用arules包加载Groceries数据集 二.探索和准备数据 三. ...
- 带你了解基于Ploto构建自动驾驶平台
摘要:华为云Solution as Code推出基于Ploto构建自动驾驶平台解决方案. 本文分享自华为云社区<基于Ploto构建自动驾驶平台>,作者:阿米托福 . 2022年6月15日, ...
- 把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10
就像黑火药时代里突然诞生的核弹一样,OpenAI的ChatGPT语言模型的横空出世,是人工智能技术发展史上的一个重要里程碑.这是一款无与伦比.超凡绝伦的模型,能够进行自然语言推理和对话,并且具有出色的 ...