scalaz-stream支持无穷数据流(infinite stream),这本身是它强大的功能之一,试想有多少系统需要通过无穷运算才能得以实现.这是因为外界的输入是不可预料的,对于系统本身就是无穷的,比如键盘鼠标输入什么时候终止.网站上有多少网页.数据库中还有多少条记录等等.但对无穷数据流的运算又引发了新的挑战.我们知道,fp程序的主要运算方式是递归算法,这是个问题产生的源泉:极容易掉入StackOverflowError陷阱.相信许多人对scalaz-stream如何实现无穷数据的运算安全都…
上节我们提到Stream和List的主要分别是在于Stream的“延后计算“(lazy evaluation)特性.我们还讨论过在处理大规模排列数据集时,Stream可以一个一个把数据元素搬进内存并且可以逐个元素地进行处理操作.这让我不禁联想到我们常用的数据搜索读取方式了:大量的数据存放在数据库里,就好像无穷的数据源头.我们把数据读取方式(那些数据库读写API函数)嵌入Stream的操作函数内,把数据搜索条件传入Stream构造器(constructor)中形成一个对数据搜索操作的描述.这个产生…
1.Stream 流的介绍 1.1 java8 stream介绍 java8新增了stream流的特性,能够让用户以函数式的方式.更为简单的操纵集合等数据结构,并实现了用户无感知的并行计算. 1.2 从零开始实现一个stream流 相信很多人在使用过java8的streamAPI接口之后,都会对其实现原理感到好奇,但往往在看到jdk的stream源码后却被其复杂的抽象.封装给弄糊涂了,而无法很好的理解其背后的原理.究其原因,是因为jdk的stream源码是高度工程化的代码,工程化的代码为了效率和…
延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用.(除了中介方法外,其余方法均为延迟方法) 终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似StringBuilder那样的链式调用.本小节中,终结方法包括count和forEach方法. 逐一处理:forEach 虽然方法名字叫forEach,但是与for循环中的for-each昵称不同 java void forEach(Consumer<? super T> action 该方法接受一个C…
在前面几次讨论中我们介绍了Free是个产生Monad的最基本结构.它的原理是把一段程序(AST)一连串的运算指令(ADT)转化成数据结构存放在内存里,这个过程是个独立的功能描述过程.然后另一个独立运算过程的Interpreter会遍历(traverse)AST结构,读取结构里的运算指令,实际运行指令.这里的重点是把一连串运算结构化(reify)延迟运行,具体实现方式是把Monad的连续运算方法flatMap转化成一串Suspend结构(case class),把运算过程转化成创建(constru…
1 无穷滚动(无限加载)与分页的比较 现在越来越多的网站或者博客的列表页开始抛弃传统的分页技术,大致的原因在于,分页明显地增加了用户的操作行为以及页面加载等待的时间,而网页浏览者往往没什么耐心. 而无穷滚动提供给了读者一种沉浸式的阅读体验.新版的Yahoo.com亦开始拥抱这一技术. 2 无穷滚动的实现原理 (1) 设置存在内容的一个容器“container”,这个容器就放着内容列表: (2) 设置计时器或者$(window).scroll()事件,计算容器“container”的高度 与 $(…
最近在公司闲着没事研究了几天,终于搞定了SSE从理论到实际应用,中间还是有一些坑的. 1.SSE简介 SSE(Server-sent events)翻译过来为:服务器发送事件.是基于http协议,和WebSocket的全双工通道(web端和服务端相互通信)相比,SSE只是单通道(服务端主动推送数据到web端),但正是由于此特性,在不需要客户端频繁发送消息给服务端,客户端却需要实时或频繁显示服务端数据的业务场景中可以使用.如:新邮件提示,在浏览网页时提示有新信息或新博客,监控系统实时显示数据...…
fs2在处理异常及资源使用安全方面也有比较大的改善.fs2 Stream可以有几种方式自行引发异常:直接以函数式方式用fail来引发异常.在纯代码里隐式引发异常或者在运算中引发异常,举例如下: /函数式 val err = Stream(,,) ++ Stream.fail(new Exception("oh,no...")) //> err : fs2.Stream[Nothing,Int] = append(Segment(Emit(Chunk(1, 2, 3))), S…
fs2是scalaz-stream的最新版本,沿用了scalaz-stream被动式(pull model)数据流原理但采用了全新的实现方法.fs2比较scalaz-stream而言具备了:更精简的基础组件(combinator).更安全的类型.资源使用(type safe, resource safety).更高的运算效率.由于fs2基本沿用了scalaz-stream的原理,所以我们会在下面的讨论里着重介绍fs2的使用.根据fs2的官方文件,fs2具备了以下新的特点: 1.完全不含任何外部依…
从表面上来看,Stream代表一连串无穷数据元素.一连串的意思是元素有固定的排列顺序,所以对元素的运算也必须按照顺序来:完成了前面的运算再跟着进行下一个元素的运算.这样来看,Stream应该不是很好的并行运算工具.但是,fs2所支持的并行运算方式不是以数据元素而是以Stream为运算单位的:fs2支持多个Stream同时进行运算,如merge函数.所以fs2使Stream的并行运算成为了可能. 一般来说,我们可能在Stream的几个状态节点要求并行运算: 1.同时运算多个数据源头来产生不排序的…