|
简介
一种全新的流式编程机制。本专栏将从零开始,深入浅出实现所有主要API,功能覆盖Java/Kotlin流式API的绝大部分,且显著提升性能。
在此基础上,更大的亮点是借助该机制,无需协程与CPS变换也可轻易实现生成器模式。不仅弥补了Java的重大缺陷,还额外带来许多实用的衍生功能。
其原理简单粗暴,API高度简洁,能增强任何支持闭包的编程语言。只要支持闭包即可,哪怕它简陋到连for循环都没有。
专栏目录
- 流的定义,一切都从forEach开始
- 流的下标与中断,实现take/drop/takeWhile/dropWhile
- 流的降维,实现flatMap
- 流的组合,实现zip
- 流的收集,基于fold/reduce实现toList/toSet/toMap/ join
- 流的分组,基于fold/reduce实现groupBy
- 流的缓存,实现cache以重复使用高开销流
- 流的累加,实现 runningFold
- 流的元素归一 ,实现any/all/none/first
- 流的元素比较,实现 sort/max/min
- 流的数学计算,实现 count/sum/average
- 流生成器,依然从forEach开始
- 基于流生成器,实现无限数列与多重笛卡尔积
- 基于流生成器,实现流的元素追加append/appendAll/appendWith
- 基于流生成器,将树的递归遍历直接转化为流
- 基于流生成器,将任意DFS直接转化为流
- 流的分段处理,前后两部分各做不同操作
- 流的性能测试,benchmark力压Java/Kotlin原生API
- 并发流,实现parallelMap/parallelForEach
- 流的万金油价值:增强几乎所有语言
- 流的应用,改良Java原生API,增强List/Set/Map
- 流的应用,两种新的高性能的List
- 流的应用,将File/Resource/InputStream转化为String流
- 流的本地缓存
- 流的应用,CSV阅读器:String流->List<String>流->Object流
- 流的应用,CSV文件头解析
背景
最近搞出来一个很有意思也很有用的玩意儿。故事大概就是就是我为了游戏玩得爽,专门研究了下AutoHotKey_v2的脚本语言,好写一些带快捷键的自动化脚本。研究之后我很快发现这个语言实在有点弱鸡,几乎没有高阶函数支持,许多重要操作甚至还是过程式的,写起脚本来体验相当不好。我心想这哪能忍,干脆游戏也懒得玩了,琢磨着怎么给这个语言加特性。
结果出乎意料,特性加着加着,加出了一个我始料未及的东西,我将其称之为一种新型的流式编程机制。这个机制非常强大灵活,对语言特性的要求也很低,可以说是个万金油,啥语言都能上。所以我决定开一篇专栏,对其进行深入浅出的、体系化的探讨。嗯,二十篇文章起步吧,我目录都列好了。
正文
首先介绍一些前置概念。所谓流式编程,具体就是指基于一些流式API的编程风格,可以帮助用户便捷的进行批量数据操作以及流转控制,例如Java里的Stream,Kotlin里的Sequence ,Python里generator与列表推导。它们通常带有一些函数式编程里的经典函数,如map,filter,take,drop reduce,groupby,yield等等。 不同语言对这些函数的实现方式大同小异,大概来说,流相关的API往往借助迭代器iterator实现 ,而生成器generator与yield的功能往往依赖于语言本身的协程调度或者虚拟机上的CPS变换。
那么有没有一种可能,完全不用iterator但是却能实现流的API?毕竟不是所有语言都有迭代器。甚至更进一步的,有没有一种可能,没有协程支持也能实现生成器generator与yield?毕竟支持协程的语言更少——比方说大名鼎鼎的Java(19以前,还有以协程主要为卖点却依然没有生成器的Go(摊手。
好了,那咱就开门见山,说说我搞出来的这个流,都有哪些好。
核心特性1:可以不依赖迭代器iterator实现流。对弱鸡的过程式语言相当友好。
核心特性2:不依赖协程/函数挂起/CPS变换实现yield与generator。为Java和Go两位老爷接上断腿。
衍生特性:将树的递归遍历乃至任何DFS直接转化为流,不受调用栈约束,全网最强。
衍生优势:比相比Kotlin的Sequence和Java的Stream提升约20%~40%的性能。
在本专栏,我将从零开始,一步一步实现出完整的流式API,生成器,以及各种常见的应用场景。同时尽力展现这种新机制的各种奇妙特性。
敬请期待!
下一篇:流的定义,一切都从forEach开始 |
|