带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)

简介: 带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(2)

带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(1)https://developer.aliyun.com/article/1339970?groupCode=taobaotech


解法

 

所有上面的这些都可以抽象为:

  1. 带有状态,且线程安全
  2. 状态可变,且根据状态的不同,对输入应用不同的操作,产生不同的值
  3. 可以提前结束、或者对不满足条件的值进行选择性丢弃
  4. 有完整的生命周期
  5. 在结束时可以根据内部状态而产生可选的值,而不会丢失内部状态

 

经过分析,这里可以表达为 : 状态 + 输入 -(应用行为)-> 新的状态 + 输出 , 这样再加上 onCraete、onComplete 生命周期函数,就可以完整表达。而提前结束等行为,则可以通过组合takeWhile

 

实现。我们将方法命名为:statefulMap,声明如下:

 

  public <S, In, Out> statefulMap(
  java.util.function.Supplier<S> create,
  java.util.function.BiFunction<S, In, Pair<S, Out>> f,
  java.util.function.Function<S, Optional<Out>> onComplete){...}

 

 

让我们看一下如何通过这个方法来实现 zipWithIndex吧:

 

实现zipWithIndex (indexed)

image.png

 

Source.from(Arrays.asList("A", "B", "C", "D"))
.statefulMap( () -> 0L,
(index, element) -> Pair.create(index + 1, Pair.create(element, index)), indexOnComplete -> Optional.empty())
.runForeach(System.out::println, system);
// prints
// Pair(A,0)
// Pair(B,1)
// Pair(C,2)
// Pair(D,3)


也可以实现 zipWithNext、zipWithPreviousAndNext 我们再看看如何实现较为复杂的 bufferUntilChanged吧

 

带你读《2022技术人的百宝黑皮书》——如何避免写重复代码:善用抽象和组合(3)https://developer.aliyun.com/article/1339967?groupCode=taobaotech

相关文章
|
11月前
|
存储 数据安全/隐私保护 开发者
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
586 8
苹果app上架app store 之苹果开发者账户在mac电脑上如何使用钥匙串访问-发行-APP发布证书ios_distribution.cer-优雅草卓伊凡
|
机器学习/深度学习 人工智能 大数据
基于联邦学习的数据隐私保护机制在智能模型训练中的应用
【8月更文第15天】随着大数据和人工智能的发展,数据隐私保护成为了亟待解决的问题。传统的集中式机器学习方法需要将数据收集到一个中心服务器进行处理,这不仅增加了数据泄露的风险,还可能触犯相关的法律法规。联邦学习(Federated Learning, FL)作为一种新兴的分布式机器学习框架,允许终端设备直接在本地数据上训练模型,并仅将更新后的模型参数发送给中心服务器汇总,从而在不暴露原始数据的情况下实现模型训练。
796 0
数字化云上博物馆,打造地质旅游新趋势!
地质旅游是以观赏和科研地质景观为目的的新兴旅游形式。为推动地质资源的保护与展示,“十四五”规划倡导“互联网+旅游”,通过数字化手段提升地质资源的展示效果。我们推出的数字化云上博物馆解决方案,利用数字技术构建虚拟空间,以高清图片、3D模型、VR/AR等技术,实现地质资源的全方位展示与互动体验,突破时空限制,让用户足不出户即可云游地质遗迹,享受地理之美。
|
JSON 安全 数据安全/隐私保护
【Web】token机制
【Web】token机制
|
存储 缓存 运维
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像
Docker镜像采用分层存储,每层代表镜像的一部分,如基础组件或应用依赖,多层叠加构成完整镜像。此机制减少存储占用,提高构建和传输效率。Docker还通过缓存机制提升构建和运行效率,减少重复工作。文章深入解析了Docker镜像分层存储与缓存机制,包括具体实现、管理优化及实际应用案例,帮助读者全面理解其优势与挑战。
520 4
|
Web App开发 Linux 应用服务中间件
【DrissionPage】Linux上如何将https改为http
通过上述步骤,可以在Linux上将DrissionPage从HTTPS改为HTTP。关键在于修改DrissionPage配置、代码中的HTTPS设置、URL以及Web服务器配置,确保所有部分都正确使用HTTP协议。通过合理配置和测试,能够确保系统在HTTP环境下稳定运行。
547 1
|
Kubernetes 应用服务中间件 Linux
多Master节点的k8s集群部署
多Master节点的k8s集群部署
|
前端开发 容器
CSS实现多行文本的展开收起
CSS实现多行文本的展开收起
682 0
|
存储 Python
Python浮点型(float)
【4月更文挑战第9天】Python中的浮点型(float)表示实数,基于IEEE 754双精度标准,约有15-17位十进制精度。创建浮点型变量可通过直接赋值,如`x = 3.14`。支持加减乘除等运算,但运算可能因精度问题产生不精确结果,如`0.1 + 0.2 != 0.3`。可使用`round()`函数四舍五入,或通过`is_close()`函数比较浮点数是否接近。在需要高精度计算时,建议使用`decimal`模块。
1152 2
|
机器学习/深度学习 数据采集 人工智能
企业如何衡量AI应用程序的成功
企业如何衡量AI应用程序的成功